Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

WinApi allgemein/Threads/Schleifen

Empfohlene Antworten

Veröffentlicht

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?

  • Autor

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.

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

  • Autor


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

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.