De Kaisastiähla Geschrieben 16. Januar 2012 Teilen Geschrieben 16. Januar 2012 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Pointerman Geschrieben 16. Januar 2012 Teilen Geschrieben 16. Januar 2012 Moin! Statt das Rad neu zu erfinden und alles selbst zu schreiben, verwende doch einen Timer: Timer bei Stackoverflow Timer bei WinAPI.de Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 16. Januar 2012 Teilen Geschrieben 16. Januar 2012 wenn ich will dass mein Programm (bisher nur fenster) jede sekunde was machen soll, wei implementiere ich das sinn voll?Kommt drauf an, was gemacht werden soll. Bei einfachen Sachen würde ich zu einem Timer raten. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
De Kaisastiähla Geschrieben 16. Januar 2012 Autor Teilen Geschrieben 16. Januar 2012 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 16. Januar 2012 Teilen Geschrieben 16. Januar 2012 Ich will dass jede Sekunde alle Fenster in einer Listbox ausgegeben/aktualisiert werden. Hier ist doch ein Thread sehrsinnvoll oder nicht?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. Nur soll er nicht die ganze Ziet laufen sondern nur alle 1000ms nachschaun.Benutz einen Timer. SetTimer function WM_TIMER message Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
De Kaisastiähla Geschrieben 17. Januar 2012 Autor Teilen Geschrieben 17. Januar 2012 #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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 17. Januar 2012 Teilen Geschrieben 17. Januar 2012 Code ist stark aufs Wesentliche eingekürzt evtl sind noch ein paar übrigbleibsel drin. 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
De Kaisastiähla Geschrieben 21. Januar 2012 Autor Teilen Geschrieben 21. Januar 2012 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.