The program solves the problem of synchronization of reader-writer streams using critical sections. How to make the protocol write to the text file along with the time (hh: mm: ss) + what happens (the reader reads, the writer writes) βthat is what I'm writing in Memo1.
//--------------------------------------------------------------------------- #include <vcl.h> #include <process.h> #include <iostream> #include <vector> #include <string> #include <sstream> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" using namespace std; DWORD WINAPI ThreadRead(LPVOID); DWORD WINAPI ThreadWrite(LPVOID); CRITICAL_SECTION cs; //ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠ΅ΠΊΡΠΈΡ vector <HANDLE> writers;//ΠΌΠ°ΡΡΠΈΠ² ΠΏΠΈΡΠ°ΡΠ΅Π»Π΅ΠΉ vector <HANDLE> readers;//ΠΌΠ°ΡΡΠΈΠ² ΡΠΈΡΠ°ΡΠ΅Π»Π΅ΠΉ vector <string> queue1;//ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π·Π°Π΄Π°Π½ΠΈΠΉ 1 vector <string> queue2;//ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π·Π°Π΄Π°Π½ΠΈΠΉ 2 int reader_count = 0;//ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠΈΡΠ°ΡΠ΅Π»Π΅ΠΉ int writer_count = 0;//ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΈΡΠ°ΡΠ΅Π»Π΅ΠΉ int queue1_length = 0;//ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°Π΄Π°Π½ΠΈΠΉ Π² ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ int queue2_length = 0;//ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°Π΄Π°Π½ΠΈΠΉ Π²ΠΎ Π²ΡΠΎΡΠΎΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ TForm1 *Form1; //--------------------------------------------------------------------------- DWORD WINAPI ThreadRead(LPVOID Param){ //ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΏΠΎΡΠΎΠΊΠ° "Π§ΠΈΡΠ°ΡΠ΅Π»Ρ" int index = *(int*)Param; while(Form1->CheckBox1->Checked == false) { if (queue1_length > queue2_length && queue1_length > 0) { Form1->Memo1->Lines->Add(IntToStr(index) + "-ΡΠΉ ΡΠΈΡΠ°ΡΠ΅Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π» ΡΡΡΠΎΠΊΡ: " + queue1.begin()->c_str()); queue1.erase(queue1.begin()); queue1_length--; Form1->Edit3->Text = IntToStr(queue1_length); //ΠΏΠΎΠΊΠ°Π·Π°ΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°Π΄Π°Π½ΠΈΠΉ Π² ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ } else if(queue2_length > 0) { Form1->Memo1->Lines->Add(IntToStr(index) + "-ΡΠΉ ΡΠΈΡΠ°ΡΠ΅Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π» ΡΡΡΠΎΠΊΡ: " + queue2.begin()->c_str()); queue2.erase(queue2.begin()); queue2_length--; Form1->Edit4->Text = IntToStr(queue2_length); //ΠΏΠΎΠΊΠ°Π·Π°ΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°Π΄Π°Π½ΠΈΠΉ Π²ΠΎ Π²ΡΠΎΡΠΎΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ } Sleep(1000); //ΡΠΈΡΠ°ΡΠ΅Π»Ρ "Π·Π°ΡΡΠΏΠ°Π΅Ρ" } } DWORD WINAPI ThreadWrite(LPVOID Param){//ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΏΠΎΡΠΎΠΊΠ° "ΠΠΈΡΠ°ΡΠ΅Π»Ρ" /*ΠΏΠΈΡΠ°ΡΠ΅Π»Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ ΠΌΠΎΠ½ΠΎΠΏΠΎΠ»ΡΠ½ΡΠΉ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ°Π·Π΄Π΅Π»Π°Π΅ΠΌΠΎΠΌΡ ΡΠ΅ΡΡΡΡΡ ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΠ½ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΡΡΡ Π² ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΡΡ ΡΠ΅ΠΊΡΠΈΡ*/ int index = *(int*)Param; while(Form1->CheckBox1->Checked == false){ EnterCriticalSection(&cs); //Π²Ρ
ΠΎΠ΄ΠΈΠΌ Π² ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΡΡ ΡΠ΅ΠΊΡΠΈΡ ostringstream ss; ss << index; if(queue1_length < queue2_length) { string str = ss.str() + "-ΡΠΉ ΠΏΠΈΡΠ°ΡΠ΅Π»Ρ Π·Π°ΠΏΠΈΡΠ°Π» Π·Π°Π΄Π°Π½ΠΈΠ΅ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ β1"; queue1.push_back(str); //Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π² ΠΊΠΎΠ½Π΅Ρ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ β1 queue1_length++; //ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΠΌ ΡΡΠ΅ΡΡΠΈΠΊ Π·Π°Π΄Π°Π½ΠΈΠΉ Form1->Edit3->Text = IntToStr(queue1_length); } else{ string str = ss.str() + "-ΡΠΉ ΠΏΠΈΡΠ°ΡΠ΅Π»Ρ Π·Π°ΠΏΠΈΡΠ°Π» Π·Π°Π΄Π°Π½ΠΈΠ΅ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ β2"; queue2.push_back(str); //Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π² ΠΊΠΎΠ½Π΅Ρ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ β2 queue2_length++; //ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΠΌ ΡΡΠ΅ΡΡΠΈΠΊ Π·Π°Π΄Π°Π½ΠΈΠΉ Form1->Edit4->Text = IntToStr(queue2_length); } LeaveCriticalSection(&cs); //ΠΏΠΎΠΊΠΈΠ΄Π°Π΅ΠΌ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΡΡ ΡΠ΅ΠΊΡΠΈΡ Sleep(2000); //ΠΏΠΈΡΠ°ΡΠ΅Π»Ρ "Π·Π°ΡΡΠΏΠ°Π΅Ρ" } } //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- /*ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΊΠ½ΠΎΠΏΠΊΠΈ "ΠΠΎΠ±Π°Π²ΠΈΡΡ ΡΠΈΡΠ°ΡΠ΅Π»Ρ*/ void __fastcall TForm1::BitBtn1Click(TObject *Sender) { reader_count++; Form1->Edit1->Text = IntToStr(reader_count); //Π²ΡΡΠ°Π²Π»ΡΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΡΠΉ ΠΏΠΎΡΠΎΠΊ "ΡΠΈΡΠ°ΡΠ΅Π»Ρ" Π² ΠΌΠ°ΡΡΠΈΠ² ΡΠΈΡΠ°ΡΠ΅Π»Π΅ΠΉ readers.push_back(CreateThread(NULL,0,ThreadRead,&reader_count,0,NULL)); } //--------------------------------------------------------------------------- /*ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΊΠ½ΠΎΠΏΠΊΠΈ "Π£Π΄Π°Π»ΠΈΡΡ ΡΠΈΡΠ°ΡΠ΅Π»Ρ*/ void __fastcall TForm1::BitBtn2Click(TObject *Sender) { reader_count--; Form1->Edit1->Text = IntToStr(reader_count); TerminateThread(readers.back(),0); readers.pop_back(); } //--------------------------------------------------------------------------- /*ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΊΠ½ΠΎΠΏΠΊΠΈ "ΠΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΠΈΡΠ°ΡΠ΅Π»Ρ*/ void __fastcall TForm1::BitBtn3Click(TObject *Sender) { writer_count++; Form1->Edit2->Text = IntToStr(writer_count); //Π²ΡΡΠ°Π²Π»ΡΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΡΠΉ ΠΏΠΎΡΠΎΠΊ "ΠΏΠΈΡΠ°ΡΠ΅Π»Ρ" Π² ΠΌΠ°ΡΡΠΈΠ² ΠΏΠΈΡΠ°ΡΠ΅Π»Π΅ΠΉ writers.push_back(CreateThread(NULL,0,ThreadWrite,&writer_count,0,NULL)); } //--------------------------------------------------------------------------- /*ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΊΠ½ΠΎΠΏΠΊΠΈ "Π£Π΄Π°Π»ΠΈΡΡ ΠΏΠΈΡΠ°ΡΠ΅Π»Ρ*/ void __fastcall TForm1::BitBtn4Click(TObject *Sender) { writer_count--; Form1->Edit2->Text = IntToStr(writer_count); TerminateThread(writers.back(),0); writers.pop_back(); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { //ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΡΠΎΡΠΌΡ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ΅ΠΊΡΠΈΠΈ InitializeCriticalSection(&cs); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { //ΠΏΡΠΈ Π·Π°ΠΊΡΡΡΠΈΠΈ ΡΠΎΡΠΌΡ ΡΠ΄Π°Π»ΡΠ΅ΡΡΡ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠ΅ΠΊΡΠΈΡ DeleteCriticalSection(&cs); } //---------------------------------------------------------------------------