Thread am Anfang wieder beginnen
-
Hallo zusammen,
Ich habe einen Thread der Funktionen ausführt die sehr lange dauern, d.h. diese Funktionen kann man abbrechen. und beim wiederbeginnen des Threads, möchte ich auch ganz am Anfang wieder beginnen und nicht dort wo ich mit suspend() aufgehört habe... mein code in der execute:
void __fastcall TRefTabThread::Execute() { while (!this->Terminated) { switch(this->Cmd)// Cmd (Command) abfragen { case DEF_READ: if (!finished) // Funktion ReadRefTab() nur ausführen wenn finish-flag nicht gesetzt ist. { ReadRefTab(this->proGrid); finished=1; // finish-flag setzten } break; case DEF_WRITE: if (!finished) // Funktion ReadRefTab() nur ausführen wenn finish-flag nicht gesetzt ist. { WriteRefTab(this->proGrid); finished=1; // finish-flag setzen } break; default: if (this->lan) Application->MessageBox("Fehler in 'TRefTabThread::Execute()'\n falsches Kommando","Fehler",16); else Application->MessageBox("Failure in 'TRefTabThread::Execute()'\n false Command","Error",16); } Application->ProcessMessages(); } } //---------------------------------------------------------------------------ReadRefTab() & WriteRefTab() sind die Funktionen die man abbrechen können muss und sehen so aus (beide Ähnlich):
void __fastcall TRefTabThread::WriteRefTab (TStringGrid *Grid) { for(int i=1; i<Grid->RowCount; i++) // schleife damit alle zeilen durchloffen werden { for (int j=0; j<Grid->ColCount; j++) // schleife damit alle spalten durchloffen werden (bei 0 beginnen damit die erste Spalze auch gesendet werden kann) { if (Main_Frm->lan) { Main_Frm->Label5->Caption="Daten schreiben... Spalte:"+IntToStr(j)+" Zeile:"+IntToStr(i); } else { Main_Frm->Label5->Caption="write data... Column:"+IntToStr(j)+" Row:"+IntToStr(i); } if (this->Cancel) // Wenn Abbruchvariable gesetzt ist, raus! { if (lan) { Main_Frm->Label5->Caption="Abbgebrochen..."; } else { Main_Frm->Label5->Caption="Aborted..."; } break; } Application->ProcessMessages(); Main_Frm->Timer_TH->Lock_CS->Acquire(); // Teil bis Lock_CS->Release() sperren damit kein anderer Thread auf die Strukur zugreifft Main_Frm->sendData.PWE1 = (Grid->Cells[j][i].ToInt()) & 0xFFFF; Main_Frm->sendData.PWE2 = (Grid->Cells[j][i]>>16)& 0xFFFF; Main_Frm->Timer_TH->Lock_CS->Release(); Main_Frm->Profi_p->SendData(&Main_Frm->sendData, 3200+j+1); Main_Frm->Timer_TH->Lock_CS->Acquire(); // Teil bis Lock_CS->Release() sperren damit kein anderer Thread auf die Strukur zugreifft int result_int=Main_Frm->result.PWE1 | (Main_Frm->result.PWE2<<16); Main_Frm->Timer_TH->Lock_CS->Release(); Grid->Cells[j][i] = IntToStr(result_int); } Main_Frm->ProgressBar1->Max=Grid->RowCount; Main_Frm->ProgressBar1->Position=i; if (this->Cancel) // Wenn Abbruchvariable gesetzt ist, raus! { break; } } this->Cancel=0;// Abbruchvariable reseten } //---------------------------------------------------------------------------Wie kann ich jetzt den Thread stoppen und wieder beginnen aber am Anfang der Execute-Funktion? Mit Suspend() und Resume() fängt Resume() dort an, wo Suspend() aufgehört hat.
Vielen Dank für eure Vorschläge!
-
Spendiere doch dem TRefTabThread eine private: Variable 'ReStart' o.ä.
mach 'ne public: Funktion SetRestart()
- in dieser setzt Du die Variable reStart=true;
- und rufst Suspend();in Execute kannste auf die Variable reagieren.
z.B.: in Deine if- Abfragen mit aufnehmen
Am ENDE von Execute (in der Schleife!) setzt Du ReStart wieder auf false,
ebenso VOR der Schleife