nebenbei etwas Prüfen

Gamer123

Mitglied
hi

mein titel kling etwas komisch, aber ich erkläre es mal. Ich möchte ein WinAPI Programm programmieren, was eigaben empfängt und verarbeitet -> kein Problem.

Zusätzlich soll es in vorgegebenen Zeitabständen automatisch prüfen ob z.B. eine Datei noch vorhanden ist und darauf reagieren. -> Problem

bei all meinen Versuchen ist etweder die CPU last auf 100% oder das ganze System hat geruckelt. gibts da eine Möglichkeit das besser zu machen

BS: WinXP
Programmierprogramm: Dev-Cpp

Vielen Dank schon mal im Vorraus
 
A: Deine Prüfung muss in einem extra Thread stattfinden
B: Zwischen den einzelnen Prüfungen ein Sleep(millisekunden) einfügen, dadurch "schläft" der Thread und somit keine CPU Last
 
danke für die schnelle antwort,

aber wie mache ich einen extra Thread, hab da keine Ahnung, kannst du vllt ein kleines Beispiel schreiben

Danke
 
danke

ich hab danach in der msdn gesucht und die TimerProc Function gefunden. Leider steig ich da nicht so wirklich durch.
Code:
VOID CALLBACK TimerProc(      
    HWND hwnd,
    UINT uMsg,
    UINT_PTR idEvent,
    DWORD dwTime
);

Parameters
hwnd=[in] Handle to the window associated with the timer. (handle auf Hauptfester)
uMsg=[in] Specifies the WM_TIMER message. (Spezifizierung von WM_TIMER, aber welche gibt es?)
idEvent=[in] Specifies the timer's identifier. (Spezifiziert timer identiter ?)
dwTime=[in] Specifies the number of milliseconds that have elapsed since the system was started. This is the value returned by the GetTickCount function. (Die Zeit in ms)

Aber wo baue ich das in meinem Program ein, wo steht die Funktion zum prüfen

Bitte um ein kleines Beispiel
 
Timer setzen:
SetTimer
Timer stoppen:
KillTimer

Wenn du beim Erstellen keine extra Prozedur angibst, die dann immer aufgerufen werden soll, wird WM_TIMER an deine Fensterprozedur übergeben. B
Beim Erstellen kannst du angeben in welchem Rhythmus du die Nachricht abarbeiten willst und bekommst eine ID, anhand derer du per KillTimer den Timer wieder beenden kannst :)

So in etwa sollte es gehen:

C++:
const unsigned int timer_id(1001);
// timer callback
VOID CALLBACK TimerProc(HWND hWnd, UINT uMsg, UINT uTimerID, DWORD dwTime)
{
    MessageBox(hWnd, TEXT("Timer event"), TEXT("Information"), MB_OK | MB_ICONINFORMATION);
}

// wo du den Timer aufrufen willst
::SetTimer(hWnd, timer_id, 100, reinterpret_cast<::TIMERPROC>(TimerProc));

// vorm beenden
::KillTimer(hWnd, timer_id);
... hWnd kann auch einfach NULL sein.
 
is ein bissel spät die antwort, aber ich hatte keine zeit zum testen.

danke erstmal für deine Bemühungen

ich hab aber noch folgendes Problem:

wenn ich das einbinde kommen fehler:
Code:
       ::SetTimer(hWnd, timer_id, 100, reinterpret_cast<::TIMERPROC>(TimerProc));

und die fehler
67 C:\Dev-Cpp\Projekte\Process\main.cpp expected `<' before '[' token
67 C:\Dev-Cpp\Projekte\Process\main.cpp expected identifier before '[' token
67 C:\Dev-Cpp\Projekte\Process\main.cpp expected primary-expression before '[' token
67 C:\Dev-Cpp\Projekte\Process\main.cpp expected `]' before ':' token
und ähnliche mehr

bedenke ich programmiere mit Dev-Cpp, muss ich noch was includen, was mache ich falsch
 
die ist immer stadtardmäsig in den Win32 Aplikation drin
hier is mal mein ganzer source, mit deinem Beispiel

Code:
#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
const char szAppName[] = "Test";
const unsigned int timer_id(1001);

static HWND eAusgabe;

// timer callback
VOID CALLBACK TimerProc(HWND hWnd, UINT uMsg, UINT uTimerID, DWORD dwTime)
{
    MessageBox(hWnd, TEXT("Timer event"), TEXT("Information"), MB_OK | MB_ICONINFORMATION);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                   PSTR szCmdLine, int iCmdShow)
{
   HWND       hWnd;
   MSG        msg;
   WNDCLASS   wc;

   wc.style         =  CS_HREDRAW | CS_VREDRAW;
   wc.lpfnWndProc   =  WndProc;
   wc.cbClsExtra    =  0;
   wc.cbWndExtra    =  0;
   wc.hInstance     =  hInstance;
   wc.hCursor       =  LoadCursor(NULL,IDC_ARROW);
   wc.hIcon         =  LoadIcon(NULL,IDI_APPLICATION);
   wc.hbrBackground =  (HBRUSH)COLOR_BACKGROUND;
   wc.lpszClassName =  szAppName;
   wc.lpszMenuName  =  NULL;
   RegisterClass(&wc);
   
   hWnd = CreateWindow(szAppName,
                       "Prüfen",
                       WS_OVERLAPPEDWINDOW,
                       CW_USEDEFAULT,          /* X-Position auf dem Monitor */
                       CW_USEDEFAULT,          /* Y-Position auf dem Monitor */
                       CW_USEDEFAULT,          /* Fensterbreite              */
                       CW_USEDEFAULT,          /* Fensterhoehe               */
                       NULL,
                       NULL,
                       hInstance,
                       NULL);
                       
 /*  eAusgabe = CreateWindow("edit","",WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|ES_READONLY,10,10,150,17,
                           hWnd,(HMENU)1201,hInstance,NULL); 
*/
   ShowWindow(hWnd, iCmdShow);
   UpdateWindow(hWnd);
   
   while (GetMessage(&msg, NULL, 0, 0))
   {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }

   return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
   switch (message)
   {
      case WM_TIMER:
      {
       // wo du den Timer aufrufen willst
       ::SetTimer(hWnd, timer_id, 100, reinterpret_cast<::TIMERPROC>(TimerProc));
      }break;
      case WM_DESTROY:
      {
         // vorm beenden
         ::KillTimer(hWnd, timer_id);
         PostQuitMessage(0);
         return 0;
      }
   }
   return DefWindowProc(hWnd, message, wParam, lParam);
}

mal davon bagesehn das der Aufruf ::SetTimer... bestimmt falsch steht, müsste doch wenigstes der befehl erkannt werden

hoffe du findest den Fehler, ich hab bestimmt alles falsch gemacht was man falsch machen kann ^^
 
ok ich habs hinbekommen
der befehl muss heisen: SetTimer(hWnd, timer_id, 100, reinterpret_cast<TIMERPROC>(TimerProc));

und muss dort stehn

Code:
   while (GetMessage(&msg, NULL, 0, 0))
   {
SetTimer(hWnd, timer_id, 100, reinterpret_cast<TIMERPROC>(TimerProc));
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }

ein ganz großes danke für deine Hilfe
 
Zurück