+ 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 ...

  1. #1
    Reg.-Benutzer
    Reg.-Datum
    25.09.2009
    Ort
    Kaiserstuhl
    Beiträge
    32

    Standard WinApi allgemein/Threads/Schleifen

    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?

  2. #2
    Reg.-Benutzer Avatar von Pointerman
    Reg.-Datum
    06.02.2002
    Ort
    Erlangen
    Beiträge
    486

    Standard

    Moin!
    Statt das Rad neu zu erfinden und alles selbst zu schreiben, verwende doch einen Timer:
    Timer bei Stackoverflow
    Timer bei WinAPI.de

  3. #3
    Administrator + Moderator
    C++: Compiler, IDEs, APIs / C und C++, Algorithmik, Basic, Sonstige, .NET
    Avatar von Klotzkopp
    Reg.-Datum
    10.07.2001
    Ort
    Essen
    Beiträge
    8.980

    Standard

    Zitat Zitat von De Kaisastiähla Beitrag anzeigen
    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.
    "Funktioniert nicht" ist keine ausreichende Problembeschreibung.

  4. #4
    Reg.-Benutzer
    Reg.-Datum
    25.09.2009
    Ort
    Kaiserstuhl
    Beiträge
    32

    Standard

    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.

  5. #5
    Administrator + Moderator
    C++: Compiler, IDEs, APIs / C und C++, Algorithmik, Basic, Sonstige, .NET
    Avatar von Klotzkopp
    Reg.-Datum
    10.07.2001
    Ort
    Essen
    Beiträge
    8.980

    Standard

    Zitat Zitat von De Kaisastiähla Beitrag anzeigen
    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.

    Zitat Zitat von De Kaisastiähla Beitrag anzeigen
    Nur soll er nicht die ganze Ziet laufen sondern nur alle 1000ms nachschaun.
    Benutz einen Timer.

    SetTimer function
    WM_TIMER message
    "Funktioniert nicht" ist keine ausreichende Problembeschreibung.

  6. #6
    Reg.-Benutzer
    Reg.-Datum
    25.09.2009
    Ort
    Kaiserstuhl
    Beiträge
    32

    Standard

    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.

  7. #7
    Administrator + Moderator
    C++: Compiler, IDEs, APIs / C und C++, Algorithmik, Basic, Sonstige, .NET
    Avatar von Klotzkopp
    Reg.-Datum
    10.07.2001
    Ort
    Essen
    Beiträge
    8.980

    Standard

    Zitat Zitat von De Kaisastiähla Beitrag anzeigen
    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.
    "Funktioniert nicht" ist keine ausreichende Problembeschreibung.

  8. #8
    Reg.-Benutzer
    Reg.-Datum
    25.09.2009
    Ort
    Kaiserstuhl
    Beiträge
    32

    Standard

    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

  1. Schleifen allgemein
    Von SusanneD im Forum Java
    Antworten: 7
    Letzter Beitrag: 01.07.2008, 15:44
  2. VCL und WinAPI
    Von Maxi1984 im Forum Delphi/RPG+CL/Sonstige
    Antworten: 1
    Letzter Beitrag: 22.04.2007, 14:14
  3. WinApi
    Von Gottesgeschenk im Forum C++: Compiler, IDEs, APIs
    Antworten: 1
    Letzter Beitrag: 09.09.2004, 11:18
  4. winapi: tabcontrol
    Von sPoOL im Forum C++: Compiler, IDEs, APIs
    Antworten: 0
    Letzter Beitrag: 28.05.2003, 10:08
  5. Dateien allgemein & Server allgemein
    Von Hechtsupp im Forum Referate
    Antworten: 0
    Letzter Beitrag: 10.04.2001, 11:32

Die häufigsten Suchbegriffe für diese Seite:

Bisher noch keine Treffer von einer Suchmaschine