Zum Inhalt springen

WinApi allgemein/Threads/Schleifen


Empfohlene Beiträge

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen


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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...