Checkbox in Schleife abfragen
-
Hallo Community,
ich bin neu hier und stehe anscheinend etwas auf dem Schlauch, jedenfalls finde ich nicht die Lösung für ein eigentlich simples Problem. Würde mich freuen, wenn jemand Lust hätte zu helfen...
Ich bin definitiv kein C++-Pro, habe aber in meinem Studium schon etwas damit gearbeitet - wobei mein Schwerpunkt eher auf PHP lag.
Ich arbeite an einem RFID-Demoprogramm. Dies soll beim Aktivieren einer Checkbox kontinuierlich im Sekundentakt alle neuen in Reichweite befindlichen Tags auslesen und mit Zeit und Datum in eine Liste eintragen. Wenn diese Checkbox jedoch wieder abgehakt ist, soll diese Routine unterbrochen werden. Und da knallts bei mir. Mein Buttonlistener scheint nur einmal den Klick zu registrieren und die Schleife starten. Ich kann dann die Checkbox gar nicht wieder abhaken und sämtliche Bedienelemente reagieren nicht. Wie kann ich erreichen, dass meine Schleife nur solange aktiv ist, wie die Box angehakt ist? Hier ein Codeschnippsel von mir:void CMifareOneDemoDlg::OnBnClickedCheck1() { bool ischecked = (m_checkauto.GetCheck()); if (ischecked == true) { for (int i = 0; i < 10; i++) { //Soll eigentlich while sein requesttag(); //auslesen des Tags und Hinzufügen zur Liste } } }
Ich konnte dazu weder bei Google noch hier etwas finden. Ist das Blödsinn, was ich da vorhabe? Oder ist das einfach nur der falsche Listener?
Im Voraus schon mal vielen Dank für Eure Hilfe!
MfG,
Kalle
-
if( c_checkauto.GetCheck() == BST_CHECKED ) StartListener(); else StopListener();
bzw. Timer starten/anhalten.
-
Ich kenne mich mit der MFC nicht aus und kann dir daher nur allgemein etwas dazu sagen.
So wie der Code für mich aussieht läuft er im selben Thread wie die GUI.
Folglich kann die GUI ihren eigenen Kram nicht mehr erledigen. Buttonclicks und andere Ereignisse werden also nicht mehr verarbeitet, da erst die Schleife abgearbeitet werden muss. Diese wird aber nicht eher beendet bis die Checkbox nicht mehr checked ist. Doch die GUI reagiert nicht und sie kann nicht mehr unchecked werden. Das Programm scheint also optisch abgestürzt zu sein.Der Fehler ist also der, dass du die Schleife im Code der GUI ablaufen lässt. Du müsstest die Abfrage also in einen eigenen Thread auslagern.
Dazu müsstest du dich nach Threads, Multithreading und so weiter erkundigen. Das Thema ist nicht ganz ohne. Du musst dich also gerade bei GUI auch um das Themen wie Mutex kümmern.
-
@---
Er muß nur im timer 1 mal pro Sekunde die Funktion aufrufen.
Da muß man gar nicht mit Gewehren (threading) auf Spatzen schiessen.
Den Rest bzgl. Mutex und so laß ich einfach mal unkommentiert so stehen. Da hat sicher noch sonstwer was dazu zu sagen.
-
EOP schrieb:
@---
Er muß nur im timer 1 mal pro Sekunde die Funktion aufrufen.
Da muß man gar nicht mit Gewehren (threading) auf Spatzen schiessen.
Den Rest bzgl. Mutex und so laß ich einfach mal unkommentiert so stehen. Da hat sicher noch sonstwer was dazu zu sagen.Wie gesagt, ich habe allgemein geantwortet. Mir ist die MFC nicht bekannt und ich wusste nicht, dass es sogar Timer gibt.
Ein Timer ist dann natürlich vollkommen angemessen. Insbesondere, wenn eine sekündliche Abfrage ausreichend ist.
Jedenfalls muss der Code so angepasst werden, dass der Timer gestartet wird und dann reicht in der Timer Funktion ja schon:
if (c_checkauto.GetCheck() == BST_CHECKED) requesttag();
Mit Mutex musst man sich im Falle eines Timers nicht beschäftigen, glaube ich. Sicher bin ich mir aber nicht.
-
--- schrieb:
Jedenfalls muss der Code so angepasst werden, dass der Timer gestartet wird und dann reicht in der Timer Funktion ja schon:
if (c_checkauto.GetCheck() == BST_CHECKED) requesttag();
Meine erste Antwort ist immer noch gültig.
Der timer selber hat gar nix abzufragen außer ob 1 Sekunde schon wieder vorbei ist oder nicht.
Edit: Weil er überhaupt nur gestartet wird wenn Aktion (requesttag()) erwünscht ist.Das scheint mir ein grundsätzliches Verständnisproblem zu sein ---.
-
Großartig, jetzt lüppts.
Mit dieser MFC-Geschichte muss ich auch erst einmal warm werden. Ich nutze Visual Studio 2008 und gelange zu der Erkenntnis, dass erstens die meisten Tutorials auf 2005 bezogen sind und zwotens händische Ergänzungen gefährlich sind. Mit dem Hinzufügen von Funktionen, Handlern, Variablen und Co. über die Assistenten gehts dann irgendwann. Macht ihr das auch so? Was er mir ergänzt hat, habe ich so in den Beispielen aus dem Netz noch nicht gefunden.
Ich persönlich finde ja, dass das meinem Überblick über den Code nicht zugute kommt... Muss ja mühselig vergleichen, was er dann überall an Code reinschiebt.
Aber wie auch immer - vielen Dank für eure Mühe, der Hinweis auf die Timer hats gebracht!
MfG,
Kalle