zeitkritische Thread-Operation
-
Ich möchte während eines Progammablaufs in einem separtaten Thread Daten einlesen - ohne den Programmablauf zu stören oder anzuhalten.
Das funktioniert so weit, die Puffer werden eingelesen etc.Als Meldung, ob das erfolgreich ist, habe ich an das Ende des Therads eine Boolesche Variable gesetzt: read_in.
In einem separaten Zyklus in der MainLoop wird der Wert dieser Variabe abgefragt - wird sie als wahr anerkannt, wird das Vorhandensein des Puffers vorausgesetzt.
Leider springt der Befehl schon kurz nach dem Daten-Einlesen weiter. Das heißt: die Meldung, die erst nach Einlesen des kompletten Datenpakets erfolgen sollte, wird vorzeitig herausgegeben. Wie kann ich das verhindern?
Hier der nicht sehr bemerkenswete Code.
public __gc class PreloadThread { public: PreloadThread( Preloader* preloader) { Preloader = preloader; }; static Preloader* Preloader; static void ThreadProc() { Preloader->read_in = false; char* datei = "Dummy.avi"; ifstream lesekopf; filebuf *pbuf; long size; char * buffer; lesekopf.open (datei, ios::binary); if (lesekopf.good() ) { pbuf = lesekopf.rdbuf(); size= pbuf->pubseekoff (0,ios::end,ios::in); pbuf->pubseekpos (0,ios::binary); buffer=new char[size]; pbuf->sgetn (buffer,size); Preloader->actual_buffer = buffer; Preloader->ab_size = size; lesekopf.close(); Preloader->read_in = true; } } };
-
nur zum verständniss, du meinst also das preloader->read_in eher true ist als er fertig ist mit dem einlesen? Wo verwendest noch preloader? evtl setzt du versehentlich ausserhalb das threat read_in auf true. da ja dein mainprog weiter arbeitet wärend der threat liest. weil so macht das für mich nen korrekten eindruck kann aber sein das ich auch was übersehe.
Edit:
hast schonmal getestet dein prog normal laufen zu lassen ohne den threat zu starten, und geschaut ob da deine meldung ebenfalls kommt? Weil wenn ja dann liegt es nicht am threat, aber wie gesagt kann auch was übersehen obwohl das alles io aussieht.
EditEdit:
öhhm habe so noch nicht mit threats gearbeitet aber die klasse ist doch stino wieso ist bei deiner blockabschliesung deines constructers ein ";"
PreloadThread( Preloader* preloader)
{
Preloader = preloader;
}; <- meine das da, entweder ich bin total doof oder das gehört da nicht hin^^obwohl stören sollte es nicht, aber keine ahnung noch nie gemacht weis nicht wie sich das auswirkt.