[wxWidgets] Threads bzw. wxThread
-
Also wenn man Klassen noch nicht mal richtig verstanden hat, dann sollte man sich noch lange nicht mit dem Thema Threads mit C++ beschäftigen (und GUI auch nicht).
-
Okay. Wenn das eine Empfehlung ist, dann nehm ich mir die mal an. Hat vielleicht keinen Sinn, vorzugreifen, wobei das Programmierproblem im Moment mehr bei Threads liegt.
-
Also...
du willst eine abstrakte Klassen verwenden
bedeutet du solltest objektorientiert Programmieren können.
Daher ist in deinem Buch das Thema Klassen wichtig...du solltest unbedingt wissen wie Klassen aufgebaut sind, was vererbung ist und wie man interfaces und abstrakte Klassen verwendet.
Anschliessend schaust du dir die Threads an - damit du weißt, was ein Thread ist und wie man einen Thread erstellt und verwendet (da dürften dann auch die Tutorials ausreichen)
oder du verwendest nicht C++ sondern C - da mußt du über Klassen nichts wissen...aber das ist dann eben was anderes. Empfehlen würd ich jedoch bei C++ zu bleiben und diese Dinge zu verstehen.
Gruß Andy
-
Takeo schrieb:
Ich hab 2 Buttons.
Button1 = Start
Button2 = StopWenn Button 1 gedrückt wird, startet eine Funktion mit einer Schleife. Diese Schleife hat eine Sleepfunktion mit drin.
Button 2 soll die Schleife sozusagen stoppen. Leider reagiert nix mehr, wenn ich ohne Threads auf Button 1 drücke. Deswegen brauch ich die Threads.Während des sleeps kannst du auch einen thread nicht "vernünftig" stoppen.
Aber du hast schon recht. Deine schleife blockiert eben den hauptthread.
Wenn du nichts groß zwischen haupt- und workerthread austauschen musst dann leitest du eine klasse von wxThread ab.
class worker : public wxThread{ public: worker(){} void * Entry(); }; void * worker::Entry(){ while(true){ if(TestDestroy()) //testen ob wir uns beenden sollen break; //mach was wxThread::Sleep(10); //Schlafe, besser ist Yield() } return NULL; }
Damit du den thread aus dem hauptthread benutzen kannst musst du ihn kreieren.
class mainthread : public wxFrame{ public: //was hier eben so kommt const bool create_and_run_worker(); void some_methode_to_cancel_the_thread(); private: worker *worker_; }; const bool mainthread::create_and_run_worker(){ if(!worker_) worker_=new worker(); switch(worker_->Create()){ case wxTHREAD_NO_ERROR:{ worker_->SetPriority(WXTHREAD_DEFAULT_PRIORITY); worker_->Run(); return true; } case wxTHREAD_NO_RESOURCE: case wxTHREAD_RUNNING:return false; default: return false; } } //wenn jetzt der thread beendet werden soll void mainthread::some_methode_to_cancel_the_thread(){ if(worker_){ worker_->Delete(); //bei non-detached threads muesstest du auch noch das object frei geben //delete worker_; } }
Wenn du noch gemeinsame resourcen hast musst du aufpassen. Aber das sind typische mt-themen. Mutexes, semaphoren und critical sections sagen dir sicher was.
Es gibt auch noch eine nette klasse wxThreadHelper von der du deinen frame ableiten kannst. Dann gestaltet sich das noch etwas einfacher. Aber das vorgehen ist im prinzip das selbe.
Sofar....