Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Bedingung "symbolleistenbutton gedrückt"

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 ] [ 3 ] [ 4 ] [ 5 ]
000
16.05.2003, 14:44 Uhr
Dirk22



Hi,

ich habe in meiner Symbolleiste 2 Symbole, die die folgenden IDs haben:
ID_BUTTON_START und ID_BUTTON_STOP

Die dazugehörigen Ereignisroutinen lauten:
CMainFrame::OnButtonStart() und CMainFrame::OnButtonStop()

Nun habe ich in OnButtonStart() eine while-Schleife.
Ich will nun, dass sie solange läuft, bis der Benutzer in der Symbolleiste auf den Button Stop (ID_BUTTON_STOP) klickt.

Leider weiss ich nicht wie ich diese Bedingung formulieren kann.


C++:

while (was muss hier rein?)
{
}



Vielen Dank im Voraus

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.05.2003, 14:52 Uhr
~Heiko
Gast


Hi,
Setze einfach ein Flag das wenn du auf start drückst auf 1 gesetzt wird und wenn du auf stop drückst auf 0 gesetzt wird


C++:
flag=1;
while(flag){//asdflkj
}



Gruss Heiko
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.05.2003, 14:58 Uhr
Dirk22



Vielen Dank für die Antwort. Da weiss ich nun wirklich nicht, warum ich da nicht selbst darauf gekommen bin. Freitagnachmittag war schon immer meine schlechteste Zeit.

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.05.2003, 15:00 Uhr
~Heiko
Gast


Denk aber dran dast du dafür ein Thread benuzten musst (wüsste nicht wie das sonst gehen soll), sonst kommst du wohl nie dazu den stopbutton zu drücken weil der immer in der schleife hängt

Gruss Heiko
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.05.2003, 15:27 Uhr
Dirk22



Genau das ist mir jetzt auch gerade aufgefallen und das wollte ich gerade fragen. Wenn das Flag nämlich in der Funktion OnStartButton() auf 1 steht, so habe ich eine Endlosschleife, aus der ich nie wieder rauskomme. Ich komme gar nie dazu den Button Stop zu drücken, mit dem ich das Flag umändern könnte.
Jetzt habe ich endlich verstanden, dass das Problem doch nicht so banal ist. Ich brauche dafür natürlich einen Thread, damit während der Schleife dennoch auch auf den Stopbutton reagiert werden kann.

Nun muss ich aber leider zugeben, dass ich keine Ahnung von Threads habe. Ist das für mein Problem kompliziert und sehr aufwendig?

Wäre super, wenn du mir da weiterhelfen könntest.

Vielen Dank im Voraus

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
16.05.2003, 15:41 Uhr
~Heiko
Gast


Wie ich bereits erwähnte hab ich auch nicht so den Plan von Threads. Ich habe mir da mal selber was zusammengebastelt, was auch zu funktionieren scheint. Ich habe allerdings keine Ahnung ob der irgendwelche sachen (man weiss ja nie) entstehen oder übrig bleiben die es nicht sollten.
Ich würde mich also freuen wenn andere mir sagen könnten was man besser machen kann.

So hier zu meinem Vorschlag:

in der Headerdatei fügst du folgende Members hinzu:

C++:
HANDLE h_Thread;
static DWORD myThread(LPVOID);
int threadflag=0;



in deine Startbuttonrutine packst du folgendes:

C++:
threadflag=1;
h_Thread=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)myThread, (LPVOID)this, 0, NULL);    



jetzt musst du noch deine Threadroutine schreiben:
wie deine Klasse heisst kann ich dir nicht sagen, da musst du halt für Klassenname den deine Klasse einsetzen
zugriff auf die members hast du dann immer über: ((Klassenname*)lparam)->member



C++:
DWORD Klassenname::LivepicThread(LPVOID lparam){

DWORD dw;

    while(((Klassenname*)lparam)->threadflag){
        //hier deinen Quellcode
    }

    GetExitCodeThread(((Klassenname*)lparam)->h_Thread, &dw);

    ExitThread(dw);

    return 0;
}



Ich habe da auch mal nen ganzen Tag dran gebastelt bis das gefunzt hat
hoffe das hilft dir

Wie gesagt über kritische Bemerkungen würde ich mich freuen

Gruss Heiko
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
16.05.2003, 15:43 Uhr
~Heiko
Gast


Ach so hab ich ganz vergessen,
in der stopmethode muss natürlich noch

C++:
threadflag=0;


stehen.
So bin jetzt bis Samstag abend nicht mehr im Forum, wenns nicht funzt musst du hoffen das ein anderer dir hilft

Heiko
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
16.05.2003, 15:46 Uhr
~Heiko
Gast


Ach und noch was,
nachdem der Startbutton gedrückt ist solltest du in disablen, bis der stopbutton gedrückt wurde.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
17.05.2003, 21:33 Uhr
Dirk22



Hallo Heiko,

vielen Dank für deine ausführliche Antwort.
Ich habe jetzt für dieses Problem allerdings eine sehr leichte Lösung gefunden:

In den Header von Mainframe kommt:


C++:
BOOL StopClicked;


in OnButtonStart() schreibe ich folgendes:


C++:

StopClicked = false;
MSG msg; //diese Strukur speichert Informationen über die Nachrichtenschlange ab

while(!StopClicked)
{
    while(PeekMessage(&msg, NULL, 0,0,PM_NOREMOVE))
              AfxGetApp()->PumpMessage();
    
    //eigener Quellcode in dieser while-Schleife

}



Mit dem PeekMessage wird überprüft, ob sich Nachrichten in der
Nachrichtenwarteschlange befinden. Diese werden dann mit dem
PumpMessagebefehl abgearbeitet
Befindet sich keine Nachricht mehr in der Nachrichtenwarteschlange, so wird der restliche Quellcode in dieser Schleife ausgeführt. Jeden Schleifendurchgang wird also am Anfang überprüft, ob es Nachrichten in der Nachrichtenwarteschlange gibt. Wenn ein Schleifendurchgang sehr lange dauern sollte kann man dieses PeekMessage und PumpMessage auch öfters unterbringen, damit öfters auf Nachrichten jeder Art geprüft und diese dann ausgeführt werden.
Die Schleife wird also abgearbeitet, sobald Nachrichten eintreffen, wie z.B. der Klick auf einen Button, wird diese Nachricht ausgeführt, und dann anschliessend wieder an der Schleife weitergearbeitet.

mfg

Dirk

P.S.: Ich bin ab Morgen über eine Woche im Urlaub.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
17.05.2003, 21:33 Uhr
Dirk22



In OnButtonStop() kommt natürlich noch:


C++:
StopClicked = true;


mfg Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ] [ 4 ] [ 5 ]     [ VC++ / MFC ]  


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: