Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Thread beenden?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
06.08.2003, 18:31 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Hi,
ich habe folgende Threadroutine

C++:
DWORD KameraMessungDlg::LivepicsThread(LPVOID lparam){

    KameraMessungDlg *dp = ((KameraMessungDlg*)lparam);

    while(dp->livepicsFlag)
        dp->PaintPics();
    
    while(!dp->messflag) Sleep(100);

    dp->EndDialog(dp->endflag);
    
    return 0;
}



wie nicht schwer zu sehen läuft der Thread durch wenn livepicsFlag==0 und messflag!=0 wird

beenden tue ich dann z.b. mittels Knopdruck so

C++:
void KameraMessungDlg::OnButtonAbbrechen(){
    messflag=1;
    endflag=2;;
    livepicsFlag=0;
}




warum aber geht das folgende nicht?


C++:
DWORD KameraMessungDlg::LivepicsThread(LPVOID lparam){

    KameraMessungDlg *dp = ((KameraMessungDlg*)lparam);

    while(dp->livepicsFlag)
        dp->PaintPics();
    
    while(!dp->messflag) Sleep(100);

    dp->terminationflag=1;
    return 0;
}




C++:
void KameraMessungDlg::OnButtonAbbrechen(){
    messflag=1;
    endflag=2;;
    livepicsFlag=0;

       while(!terminationflag) Sleep(100);
       EndDialog(endflag);
}




nach dem Buttonklick hängt der mir immer in der Endlosscheife

C++:
while(!terminationflag) Sleep(100);


weil der Thread niemals dazu kommt das flag auf 1 zu setzen. Eigentlich müsste der doch aber irgendwann da mal ankommen

Warum geht das nicht?


Danke Gruss Heiko
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 06.08.2003 um 18:32 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.08.2003, 19:56 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


NOch was

wenn ich ne MessageBox ausgebe dann funzt das.
while(!terminationflag){AfxMessageBox("test"); Sleep(100);}

Anscheinend reisst die Buttonmethode die komplette rechenzeit an sich und erlaubt es dem thread nicht weiterzumachen bis die buttonmethode beendet ist. Sowas wie ne Messagebox scheint das zu untebrechen.

Hat keiner ne Idee?

Gruss Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.08.2003, 20:02 Uhr
kronos
Quotenfisch
(Operator)



C++:
while(!dp->messflag) Sleep(100);
    dp->terminationflag=1;

falls das flag == 0 ist, wieso sollte er jemals in der zweiten zeile ankommen? (außer wenn ein anderer thread das flag auf !=0 setzt, natürlich)
die messagebox wird ausgeführt, genauso wie sleep, sie ist ja innerhalb der endlosschleife
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
06.08.2003, 20:16 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@kronos
wenn du auf den butten klickst wird das messflag 1
das ist auch nicht das problem diese Schleife ist eher noch ein relikt und kann später wegfallen, falls das funzen sollte.
wenn ich den dialog allerdings aus dem thread beenden muss ist die notwendig

Er kommt ja nichtmal bei dieser schliefe an solange der sich in der buttonmethode befindet.

Problem ist wie gesagt das der den Thread nicht mehr abarbeitet so lange der sich in der buttonmehtode befindet und diese wartet ja gerade drauf das der thread fertig wird

Jetzt alles klar

Gruss Heiko
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 06.08.2003 um 20:16 Uhr von Heiko editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
06.08.2003, 22:32 Uhr
kronos
Quotenfisch
(Operator)


ach so, jetzt...
ka, hast du messageflag vielleicht zweimal deklariert?
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
06.08.2003, 23:20 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@kronos
nein da ist kein fehler weiter.

Ich habe das auch schon ausführlich getest und weiss das es daran liegt das der Thread solange nicht weiterarbeitet, bis die blöde Buttonmehtode beendet ist. Was ich such ist ne Lösung wie ich den Thread dazu bringen kann trotzdem weiterzulaufen

Gruss Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
07.08.2003, 00:59 Uhr
kronos
Quotenfisch
(Operator)


button-methode als thread starten?
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
07.08.2003, 11:38 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


da beisst sich dann ja die katze in den schwanz.
ich will ja das die Buttonmehtode den Dialog beendet. Dann müsste die Buttonmethode wiederum darauf warten das der zweite Thread seine Arbeit getan hat was dann ja zu dem selben problem kommt.

Kann mir das villeicht zumindest einer erklären warum das so ist?

Gruss Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
07.08.2003, 13:16 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Mit

C++:
void KameraMessungDlg::OnButtonAbbrechen(){
    messflag=1;
    endflag=2;;
    livepicsFlag=0;

       while(!terminationflag) Sleep(100);
       EndDialog(endflag);
}



legst du dein Programm lahm...
Wenn man Sleep im Hauptthread auszuführt gabs bei mir auch immer Probleme.

Machs halt so:

Abbrechen geklickt -> weiterer Thread startet und führt das terminationflag zeug aus -> wenn terminationflag da ist -> daraus den Dialog schliessen

bzw lass den 2ten Thread auf weg:
Abbrechen gedrückt -> Terminationflag setzen
Bei Threaddurchlauf wenn Term-Flag gesetzt Dialog beenden
--
class God : public ChuckNorris { };

Dieser Post wurde am 07.08.2003 um 13:17 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
07.08.2003, 13:52 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@Flo

ja aber nach deiner beschreibung muss ich den Dialog doch im Thread beenden (also Enddialog in meinem Thread aufrufen) und dass will ich ja gerade vermeiden oder habe ich dich falsch verstanden?
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: