Hi,
wenn ich will dass mein Programm (bisher nur fenster) jede sekunde was machen soll, wei implementiere ich das sinn voll?
Ich gehe davon aus, dass ich beim der WM_CREATE message einen Thread erstelle der was macht und dann 1000ms in Sleep(1000); geht oder ?
Oder gibt es da sinnvollere Herangehensweisen?
+ Antworten
Ergebnis 1 bis 8 von 8
WinApi allgemein/Threads/Schleifen
Diskussion über WinApi allgemein/Threads/Schleifen in C++: Compiler, IDEs, APIs der Kategorie Programmierung; Hi, wenn ich will dass mein Programm (bisher nur fenster) jede sekunde was machen soll, wei implementiere ich das sinn ...
- 16.01.2012 01:54 #1Reg.-Benutzer
- Reg.-Datum
- 25.09.2009
- Ort
- Kaiserstuhl
- Beiträge
- 32
WinApi allgemein/Threads/Schleifen
- 16.01.2012 08:37 #2
Moin!
Statt das Rad neu zu erfinden und alles selbst zu schreiben, verwende doch einen Timer:
Timer bei Stackoverflow
Timer bei WinAPI.de
- 16.01.2012 08:40 #3
- 16.01.2012 14:16 #4Reg.-Benutzer
- Reg.-Datum
- 25.09.2009
- Ort
- Kaiserstuhl
- Beiträge
- 32
Ich habe bisher nur Konsolenprogramme geschrieben udn bin mir nicht ganz sicher wo jetz der eigentliche Programmcode rein soll, da in der WINMAIN ja nur GUI zeugs steht und am Ende der IP in einer Endlosschleife kursiert. Ich will dass jede Sekunde alle Fenster in einer Listbox ausgegeben/aktualisiert werden. Hier ist doch ein Thread sehrsinnvoll oder nicht? Nur soll er nicht die ganze Ziet laufen sondern nur alle 1000ms nachschaun.
- 16.01.2012 14:24 #5
Administrator + Moderator
C++: Compiler, IDEs, APIs / C und C++, Algorithmik, Basic, Sonstige, .NET
- Reg.-Datum
- 10.07.2001
- Ort
- Essen
- Beiträge
- 8.980
Nein. Einen weiteren Thread brauchst du, wenn während eines längeren Vorgangs dein GUI bedienbar bleiben soll. Threads sind auch nicht ganz einfach in der Handhabung. So dürfen neue Threads beispielsweise nicht so einfach auf Steuerelemente des GUI-Threads zugreifen.
Benutz einen Timer.
SetTimer function
WM_TIMER message"Funktioniert nicht" ist keine ausreichende Problembeschreibung.
- 17.01.2012 02:01 #6Reg.-Benutzer
- Reg.-Datum
- 25.09.2009
- Ort
- Kaiserstuhl
- Beiträge
- 32
Code:#include "Windows.h" #include "Tchar.h" #include "stdio.h" #include "stdlib.h" #include <vector> #include <string> #include "resource.h" using namespace std; //_____________________________________________________________________________ // Global variables static TCHAR szWindowClass[]= _T("mthb"); // The main window class name. static TCHAR szTitle[] = _T("MyTHB"); // The string that appears in the application's title bar. static const int TimerID; //_____________________________________________________________________________ // Prototypes LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); //============================================================================== int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpcmdline, int ncmdshow) //============================================================================== { MSG message; HWND hWnd; WNDCLASSEX windowclass; // Struktur für Fenstereigenschaften windowclass.cbSize = sizeof (WNDCLASSEX); windowclass.style = CS_HREDRAW | CS_VREDRAW; windowclass.lpfnWndProc = WindowProc; windowclass.cbClsExtra = 0; windowclass.cbWndExtra = 0; windowclass.hInstance = hInst; windowclass.hIcon = LoadIcon (hInst, MAKEINTRESOURCE(IDI_ICON1)); windowclass.hIconSm = LoadIcon (hInst, MAKEINTRESOURCE(IDI_ICON1)); windowclass.hCursor = LoadCursor (NULL, IDC_ARROW); windowclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND+1; windowclass.lpszMenuName = NULL; //(LPCWSTR)("Datei"); windowclass.lpszClassName = szWindowClass; // Fensterklasse registrieren if (!RegisterClassEx (&windowclass) ){ MessageBox(NULL, _T("Call to RegisterClassEx failed!"), _T("ManusApp"), NULL); return 1; } // Fenster-Handle erzeugen hWnd = CreateWindowEx ( NULL,//WS_EX_TOOLWINDOW, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 400, NULL, NULL, hInst, NULL); // Test Create(); if (!hWnd){ MessageBox(NULL,_T("Call to CreateWindow failed!"),_T("ManusApp"),NULL); return 1; } ShowWindow(hWnd, SW_SHOWNORMAL); UpdateWindow(hWnd); // Empfange Nachrichten while (GetMessage(&message, NULL, 0, 0) ){ TranslateMessage (&message); DispatchMessage (&message); } return (int)(message.wParam); } // WinMain //============================================================================== LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) //============================================================================== { switch (message){ //------------------------------------------------------------------------- case WM_CREATE: { if (!SetTimer(hWnd, TimerID, 1000, NULL)) MessageBox(NULL, _T("No timer available"), _T("ManusApp"), NULL); return (0); } //------------------------------------------------------------------------- case WM_DESTROY: { //KillTimer(hWnd, TimerID); PostQuitMessage (0); return (0); } //------------------------------------------------------------------------- case WM_TIMER: { Beep(7000,100); return 0; } //------------------------------------------------------------------------- return (DefWindowProc (hWnd, message, wParam, lParam) ); } // WindowProc
Danke für eure Hilfe bisher. Also ich hab mir die Dokumentationen und viele Beispiele durchgelesen. Aber irgendwie funktioniert der Timner nicht. Witigerweise wenn ich die negation vor SetTimer wegmache kommt natürlich die Meldung also die MessageBox ABER der Timer läuft bzw es piepst. Und zwar NUR SO LANGE bis ich ich die messagebox wegklicke. Ich versteh die Welt nicht mehr. Könnt ihr mir helfen?
Code ist stark aufs Wesentliche eingekürzt evtl sind noch ein paar übrigbleibsel drin.
Danke schonmal und viele Grüße.
- 17.01.2012 06:23 #7
Administrator + Moderator
C++: Compiler, IDEs, APIs / C und C++, Algorithmik, Basic, Sonstige, .NET
- Reg.-Datum
- 10.07.2001
- Ort
- Essen
- Beiträge
- 8.980
Du solltest du darauf achten, dass der gekürtze Code dasselbe Fehlerverhalten zeigt. Dein Code lässt sich gar nicht erst compilieren, weil in WindowProc eine schließende geschweifte Klammer fehlt. Wenn ich diese und ein default-Label für die letzte Return-Anweisung ergänze, läuft das Programm so, wie es soll.
Der Fehler steckt vermutlich in dem Code, den du weggelassen hast.
Deine Einrückung ist übrigens abenteuerlich."Funktioniert nicht" ist keine ausreichende Problembeschreibung.
- 21.01.2012 16:24 #8Reg.-Benutzer
- Reg.-Datum
- 25.09.2009
- Ort
- Kaiserstuhl
- Beiträge
- 32
Okay hatte etwas Eile, sorry. Also hab den Fehler selbst gefunden. Es war ziemlich ungeschickt einen Timer mit 0 zu initialisieren. Und dann auch noch const.

Greets
Aktive Benutzer
Aktive Benutzer
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
Ähnliche Themen
-
Schleifen allgemein
Von SusanneD im Forum JavaAntworten: 7Letzter Beitrag: 01.07.2008, 15:44 -
VCL und WinAPI
Von Maxi1984 im Forum Delphi/RPG+CL/SonstigeAntworten: 1Letzter Beitrag: 22.04.2007, 14:14 -
WinApi
Von Gottesgeschenk im Forum C++: Compiler, IDEs, APIsAntworten: 1Letzter Beitrag: 09.09.2004, 11:18 -
winapi: tabcontrol
Von sPoOL im Forum C++: Compiler, IDEs, APIsAntworten: 0Letzter Beitrag: 28.05.2003, 10:08 -
Dateien allgemein & Server allgemein
Von Hechtsupp im Forum ReferateAntworten: 0Letzter Beitrag: 10.04.2001, 11:32
Die häufigsten Suchbegriffe für diese Seite:
Bisher noch keine Treffer von einer Suchmaschine

LinkBack URL
About LinkBacks
Zitieren