Auf einen Button reagieren (visual c++)

Hallo !

Ich habe in einem Programm, das fuer eine Steuerung eines Experimentes verantwortlich ist, eine Schleife, die sehr oft durchlaufen wird.
Das ganze ist sehr Zeitaufwendig. Es werden Daten eingelesen und Spannungen ausgegeben. Das ganze geht zum Teil ueber einige Stunden.
Nun wuerde ich gerne per Knopfdruck (Button) diese Schleife vorzeitig beenden koennen.
Das Problem ist nur, dass alle Buttons, die ich waerend dessen druecke erst nach beenden der Schleife eine auswirkung haben (zumindest wird erst dann das OnButton aufgerufen).
Gibt es da irgend eine Moeglichkeit vielleicht die Message das der Button gedrueckt wurde in der Schleife aubzufangen/abzufragen ?

Die Alternative waere wohl, dass ich das ganze uber einen Timer mache und nur „gelegentlich“ die Sachen in der der Schleife durcharbeite. Aber das koennte mir etwas zu langsam sein !
Oder seht ihr noch eine andere Alternative ?

Vielen Dank sagt
Martin

Hallo Martin,

Ich habe in einem Programm, das fuer eine Steuerung eines
Experimentes verantwortlich ist, eine Schleife, die sehr oft
durchlaufen wird. Das ganze ist sehr Zeitaufwendig. Es werden
Daten eingelesen und Spannungen ausgegeben. Das ganze geht zum
Teil ueber einige Stunden.

Das Problem ist nur, dass alle Buttons, die ich waerend dessen
druecke erst nach beenden der Schleife eine auswirkung haben

Ohne genau erkennen zu können, was Du womit machst, tippe
ich auf Win32-API und rate Dir, gelegentlich (alle 1000 Messwerte)
die Funktion Sleep(DWORD ms) oder dergleichen aufzurufen, um
etwas Prozesszeit an das übrige Windows-System abzugeben.

Ich selbst würde eine 2-Thread-Lösung bevorzugen, ein Thread
(worker thread) liest die Messwerte ein und ruft pro Umlauf eine
kleine Funktion auf: BOOL NeedMessreiheStopNow() oder so.

Der andere Thread ist für die Oberfläche und die Fenster zuständig.
Eine entsprechende Button-Aktion resultiert im Aufruf der kleinen
Funktion void SetMessreiheStopNow().

Diese beiden Funktionen greifen dann auf eine
Modul-lokale Variable static int MessreiheStop; zu,
entweder simpel durch setzen und auslesen oder
richtig cool über einen Semaphor-Mechanismus.
Hört sich kompliziert an? Ist es nicht. Wenn Du
die fertige Lösung siehst, reibst Du Dir die Augen :wink:

Oder aber Du meinst etwas ganz anderes mit Deiner
Messwerteerfassungsprogrammiererei?

Grüße

Euer CMБ

hallo, du solltest die schleife in einem eigenen thread ausführen, der dann durch drücken deines buttons gestoppt werden kann.

z.B. so:

UINT ThreadProc(LPVOID pParam)
{
 while(true)
 {
 // hier schnick schnack einfügen.

 if(m\_bStopThread==true) break;
 }
}


void MyDlg::Start() 
{
 m\_bStopThread = false;
 AfxBeginThread(ThreadProc, this);
}


void MyDlg::Stop() 
{
 m\_bStopThread = true;
}

Hi,

hallo, du solltest die schleife in einem eigenen thread
ausführen, der dann durch drücken deines buttons gestoppt
werden kann.

Schau an, „zwei Doofe - ein Gedanke“ :wink:

Apropos: gibt es in Win32-API eigentlich eine
andere vernünftige Möglichkeit, um einen
numerischen-Dauerloop irgendwie in ein
Programm einzubinden, ohne die
Programmlogik mit GetMessage()/TranslateMessage()-calls
zu versauen? Wie ist das bei MFC?

Grüße

CMБ