Multitasking in C++

Jason20

Grünschnabel
Hallo Leute ich güße euch

hab eine kleines aber bedeutendes Problem und bräuchte kompetene Hilfe ...

Möchte in C++ Daten über serielle Port schicken - das Funktioniert auch. Ich klicke auf einen Button "Port öffnen" und er öffnet sich. Dann klicke ich auf Senden und in der Funktion "OnBTNSenden" rufe ich die Funktion "SendData" auf. Diese sendet dann einen String an einen COM-Port, solange bis ...

Und hier setzt mein Problem an: Ich kann das Senden nicht abbrechen. Ich will es nicht, dass der String 10 mal gesendet wird und dann von alleine aufhört. Ich möchte, dass er solange sendet, bis ich auf den Button Abbrechen klicke

Das geht aber nicht, da ich ja noch in der Funktion "SendData" fest sitzte, die in der Prozedur "OnBTNSenden" aufgerufen wurde --> d.h. dass die Prozedur "OnBTNSenden" ja auch noch nicht beendet ist und somit kann ich nichts mehr machen - und das Programm stürtzt später ab.

Geht denn kein Multitasking in C++ sodass das Senden im Hintergtrund agieren kann, bis ich "Abbrechen" drücke ?!

Bitte helft mir

Danke
 
Also das müsste gehen wenn du um deine Senden Funktion eine

while( !kbhit() )
{

}

machst, kann auch sein das der Befehl kb_hit() hieß, da bin ich nicht ganz sicher... Teste das einfach mal, evtl fehlt auch noch eine include, aber da sollte dir deine Hilfe weiterhelfen ;)
 
Klar geht das, in dem Fall wirst du um einen Thread nicht drumrum kommen.
Dein Programm klingt nach MFC, so dass du am besten einen CThread benutzt, der das Bearbeiten von Threads recht einfach macht.

Du könntest auch ohne Thread auskommen (Threads sind immer etwas aufwendiger), wenn die Daten, die du raussendest, nicht auf die Millisekunde genau rausorgeln müssen. Dann würde ein simpler Timer ausreichen (SetTimer, KillTimer). Dann könntest du einfach in WM_TIMER (bzw. OnTimer) einmal ein Datenpaket rausschieben.
 
also das mit kbhit() hat nicht funktioniert - geht glaube ich nur in C.Danke trotzdem MFC OpenGL

Aber ich interessiere mich für die Timergeschichte. ich versteh aber noch nicht ganz was ich da alles brauche. hast du (Endurion und auch alle anderen) da vielleicht ein kleines Beispiel parat ?! Mir fehlt ein entscheidender Absatz und MSDN hilft mir nicht viel weiter

BITTE
 
moin


Also nen Timer erstellst du ganz:
Code:
#define TIMER_1 1

.......

SetTimer(hWnd, TIMER_1, 1000, NULL);

hWnd ist ein Handle auf dein Programm.
TIMER_1 ist eine ID zu diesem Timer, du brauchst sie um mit dem Timer zuarbeiten und um ihn zu beenden.
1000 = 1sek
Wo jetzt NULL steht, könntest du auch den Namen einer Funktion hinschreiben die dann in 1 Sekunden abständen aufgerufen wird.

Wenn du weitere Fragen hast, frag!

Außerdem wäre es hilfreich wenn du schreibst was für eine Anwendung du schreiben willst (MFC / API / Konsolenanwendung).


mfg
umbrasaxum
 
schreibe eine MFC-Applikation. Danke für den Hinweis, aber ich finde bei meinem Projekt irgendwie keinen "Handel". Wo steht denn der immer oder wie heist der üblicherweise
 
moin


Welche Entwicklungsumgebaung nutzt du denn?

Und gleich für die Zukunft: Schreib immer gleich welche Sprache Welcher Compiler/Ide.
Dann kann dir viel schneller und genauer geholfen werden.


mfg
umbrasaxum
 
hab als Handel jetzt mal probiert:

Code:
   CProjekt test;
   
   SetTimer ( test.m_hwnd , TIMER_! , 1000 , SendData() );

und jetzt kommt die Fehlermeldung, dass die Funktion nicht 4 Parameter akzeptiert und dannach das die Konvertierung von Parameter 1 von 'struct HWND__ *' in 'unsigned int' nicht möglich ist (nur über casten)

bin ich auf dem richtigen Weg, oder hab ich was falsch gemacht ...


ich nutze Visual C++ mit MFC -- Sorry, bin neu
 
Ey, danke für den Link - hat mir voll was gebracht. Jetzt funktioniert es so, wie ich es haben möchte

Danke vielmals auch an alle Anderen - für die schnellen Antworten
 
Zurück