Problem mit Visual C++ (MFC)

Hallo,

ich habe ein Problem in der Programmierung mit Visual C++ (MFC), vielleicht könnt ihr mir dabei helfen. Also, ich will einen Wert setzen, anschließend mit Hilfe einer Dauerschleife eine Zeitlang verweilen und den Wert danach wieder zurücksetzen und im Anschluß daran erneut eine Zeitlang verweilen. Diesen Vorgang möchte ich 200 mal in einer for-Schleife durchführen, d.h. ich hätte eine Art Blinklicht programmiert. In die for-Schleife springe ich hinein, sobald ich einen Button drücke. Der Programmcode befindet sich in der Dialog-Klasse.

Hintergrund ist die Programmierung eines Schrittmotors, der auf negative Flanken einen Schritt macht. Im Programmbeispiel, würde der Motor also 100 Schritte machen, sobald ich den Button betätige. Fragt mich nicht wieso ich das ganze so umständlich programmiere. Ich weiß der Einsatz eines Timers macht mehr Sinn. Allerdings habe ich meinen Schrittmotor bereits mit dem MFC-Timer programmiert und dabei festgestellt, dass ich damit nicht die Geschwindigkeit erreichen kann, mit der mein Motor laufen soll.

Zurück zum eigentlichen Problem, ich lasse mir das setzen, bzw. zurücksetzen über ein Ein-/Ausgabe Feld anzeigen (SetDlgItemInt(IDC_EDIT1,x)). Allerdings musste ich feststellen, dass mein Programm so nicht funktioniert. Sobald ich den Button betätige, müsste ich etwas sehen in meinem Edit Control-Fenster, aber nichts geschieht beim betätigen des Buttons. Nur, dass sich das Programm in einer Schleife befindet, da der Button nicht sofort wieder in seinen alten Zustand (nicht betätigt) zurückkehrt, kann man erkennen. Ich habe das Gefühl mein Programm befindet sich in einer Art Deadlock-Situation.

Kennt ihr das Problem auch? Wenn ja, wisst ihr einen Ausweg?

Wenn ich so etwas in der Art in einer einfachen Konsolenanwendung programmiere, also auf die herkömmliche C++ Art mit main-procedure funktioniert es jedenfalls.

Bitte um Hilfe

Gruss

Oliver

Hier ist der Programmcode, der sich in der Dlg-Klasse befindet (Header ausgeklammert):

Im auskommentierten Bereich habe ich versucht eine Check-Box zu aktivieren und deaktivieren, sobald der Button gedrückt wird (200mal). Hat ebenfalls nicht funktioniert.

unsigned long int CTimerfunktionDlg::x = 0;

void CTimerfunktionDlg::open\_mouth:nBnClickedButton2()
{
 unsigned long int n1;
 for(n1=0;n1(GetDlgItem(IDC\_CHECK1));
 ASSERT(pCBtn);
 if (pCBtn-\>GetCheck() == 1){
 pCBtn-\>SetCheck(0);
 }
 \*/
 x = 0;
 SetDlgItemInt(IDC\_EDIT1,x); // Edit Control-Fenster --\> Wert 0
 for(n2=0;n2GetCheck() == 0){
 pCBtn-\>SetCheck(1);
 }
 \*/
 x = x + 1; // x = 1
 SetDlgItemInt(IDC\_EDIT1,x); // Edit Control-Fenster --\> Wert 1
 for(n2=0;n2GetCheck() == 1){
 pCBtn-\>SetCheck(0);
 }
 \*/
 x = x - 1; // x = 0
 SetDlgItemInt(IDC\_EDIT1,x); // Edit Control-Fenster --\> Wert 0
 for(n2=0;n2

Hi Oliver,

dein Problem liegt wohl darin, daß Windows Message-gesteuert ist, und innerhalb deiner Schleifen kein MessageHandler aufgerufen wird, der diese verarbeitet. Somit „hängt“ dein Programm, bis zum Ende der Schleife. Erst danach werden Edit-Felder o.ä. upgedated. Abhilfe schafft dir diese Funktion. (Am besten irgenwo bei deiner Steuerungsausgabe innerhalb der Schleifen reinsetzen).
Ist zwar uralt C-Code(API), aber funktioniert.

int MessageLoop (int flg) {
 MSG msg; 
 int done=0;
 // Fall 1 -\> Warten bis alle Meldungen abgearbeitet sind
 if (flg) while (PeekMessage (&msg, NULL, 0, 0,PM\_REMOVE)) {
 TranslateMessage (&msg) ;
 DispatchMessage (&msg) ;
 done= 1;
 } else {
 // Fall 2 -\> mindestens 1 Meldung abarbeiten
 if (PeekMessage (&msg, NULL, 0, 0,PM\_REMOVE)) {
 TranslateMessage (&msg) ;
 DispatchMessage (&msg) ;
 done= 1;
 }
 } 
 return done; 
} 

Gruß,
husky

Hallo,

und vielen Dank husky. Ich werde gleich mal probieren, den Code
in meinem Programm unterzubringen.

Gruss

Oliver