Newsgroup: it.comp.programmare.win32
Titolo: Timer & Finestre

ciao a tutti, nella mia pallicazione vorrei utilizzare un timer, senza che
pero' debba utilizzare finestre, handle....
ho visto la funzione
 timer_number = SetTimer(
 "handle to main window","timer identifier","interval", (TIMERPROC)
MyTimerProc);
dall'msdn mi sembra di aver capito che impostando a NULL "handle to main
window" e impostando MyTimerProc
dovrei riuscire a fare questa cosa senza usare applicazioni basate su
finestre & handle.
il fatto e' che non funziona!
sbaglio qualcosa?
non mi da errore in compilazione, quindi penso che
la definizione di MyTimerProc sia corretta (tra l'altro l'ho presa
dall'msdn!)
chi mi sa aiutare?
grazie
--
Ciao by Allanon
Q: Why do programmers always mix up Christmas and Halloween?
A: Because 25 Dec = 31 Oct

 dall'msdn!)
Se non sbaglio, anche quando usi la TIMERPROC devi specificare un handle di
finestra valido.
Questo perché e la default window procedure che riceve il messaggio WM_TIMER
e lo trasforma in una chiamata alla TimerProc.
Se specifhi un window handle nullo, allora il messaggio WM_TIMER viene
inserito nella coda dei messagi del thread però non è ricevuto da nessuna
finestra e non avviene alcuna chiamata della TimerProc.
Infatti proprio su MSDN ci sono degli esempi per gestire la TimerProc
specificando un handle di finestra nullo:
Creating a Timer
The following example uses the SetTimer function to create two timers. The
first timer is set for every 10 seconds, the second for every 5 minutes.
// Set two timers.
SetTimer(hwnd,             // handle to main window
    IDT_TIMER1,            // timer identifier
    10000,                 // 10-second interval
    (TIMERPROC) NULL);     // no timer callback
SetTimer(hwnd,             // handle to main window
    IDT_TIMER2,            // timer identifier
    300000,                // 5-minute interval
    (TIMERPROC) NULL);     // no timer callback
To process the WM_TIMER messages generated by these timers, add a WM_TIMER
case statement to the window procedure for the hwnd parameter.
case WM_TIMER:
    switch (wParam)
    {
        case IDT_TIMER1:
            // Process the 10-second timer.
             return 0;
        case IDT_TIMER2:
            // Process the 5-minute timer.
            return 0;
    }
An application can also create a timer whose WM_TIMER messages are processed
not by the main window procedure but by an application-defined callback
function, as in the following code sample, which creates a timer and uses
the callback function MyTimerProc to process the timer's WM_TIMER messages.
// Set the timer.
SetTimer(hwnd,                // handle to main window
    IDT_TIMER3,               // timer identifier
    5000,                     // 5-second interval
    (TIMERPROC) MyTimerProc); // timer callback
The calling convention for MyTimerProc must be based on the TimerProc
callback function.
Ed ecco il tuo caso:
If your application creates a timer without specifying a window handle, your
application must monitor the message queue for WM_TIMER messages and
dispatch them to the appropriate window. Note that GetMessage can return -1
if there is an error.
HWND hwndTimer;   // handle to window for timer messages
MSG msg;          // message structure
    while (GetMessage(&msg, // message structure
            NULL,           // handle to window to receive the message
            NULL,           // lowest message to examine
            NULL)          // highest message to examine
           != 0 && GetMessage(&msg, NULL, NULL, NULL) != -1)
    {
        // Post WM_TIMER messages to the hwndTimer procedure.
        if (msg.message == WM_TIMER)
        {
            msg.hwnd = hwndTimer;
        }
        TranslateMessage(&msg); // translates virtual-key codes
        DispatchMessage(&msg);  // dispatches message to window
    }
Ma io ti sconsiglierei di utilizzare questo metodo ed utilizzerei una
finsetra d'appoggio per gestire il Timer.
Ciao
Porlock

 Ciao by Allanon
ciao