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); } //--------------------------------------------------------------------------- 
  • Maybe pens?) - MrBin
  • The protocol is needed on the instructions. - Trapezant
  • Well, take and open the file. Write down the time and message. Close on exit. - MrBin
  • and with what function to record the time? - Trapezant
  • one
    [and using what function to record time?] Get time with time (), convert time to a string with localtime () and asctime (), and write a string to a file like any other string. - pepsicoca1

0