Newsgroup: it.comp.programmare.win32
Titolo: Applicazione, non ti bloccare

(Scusatemi per il subj "idiota", ma non sapevo cosa scrivere :) )
Allora, il mio problema e' questo:
 Una semplice applicazione, basata su auna dialog, con un menu
e una list box.
Selezionando da menu' "Aggiungi contenuto Directory", l'applicazione
fa scegliere una directory e poi, usando le API FindFile&C. legge tutti
i file della directory e li mette nella list.
Ora, se i file sono pochi, l'operazione dura qualche nanosecondo, se
invece i file sono diversi centinaia, l'applicazione si pianta, ma non mi
da' errori tipo "Spazio della lista esaurito" o errori di inserimento vari,
si blocca e basta :/
Ho pensato :" Quest'operazione la sto' facendo nella DialogProc,
probabilmente l'applicazione decede perche' non riesce + a gestire
i messaggi", percio' ho pensato, ogni 10/15 file do' la possibilita'
all'applicazione di gestire qualche messaggio, poi continuo.
La domanda e': come faccio? Non vorrei uscire dal mio bel loop,
magari mi accontenterei di chiamare al suo interno una qualche API
(o una combinazione di queste) per permettere di gestire i mesaggi...
Qualche idea?
Grazie
Killer

 Killer
Se ho capito il tuo problema, aggiungi un doevents (parola chiave di una
funzione) nel ciclo, di modo che i messaggi vengano gestiti.. Io in VB faccio
cosi'...
--
sWiTcH
"...being angel is too hard, you don't need wings to be... a devil..."

Qualche idea?
metti la tua funzione fnPopulateListBox in un bel worker thread con
una priority piu' bassa..  
Saluti, 
  Walker Boh

 una priority piu' bassa..
? Scusami, ma sono alle prome armi...
Che intendi per "worker thread"? Come lo creo?
Penso sia un processo "parallelo" a quello che gestisce la finestra, ho azzeccato?
Grazie
Killer

 cosi'...
Io uso il C++ e non c'e' la DoEvents :/
Bow-wow
Killer

 mesaggi...
Premesso che e` molto brutto fare cosi` (sarebbe *molto* meglio un
thread separato), questa e` un'altra situazione in cui puo` servire
PeekMessage(). Puoi cioe` implementare un "miniloop dei messaggi"
all'interno della window procedure, che ne estragga e processi qualcuno
(sincerandosi che non sia lo stesso che stai processando, altrimenti
potresti andare in ricorsione!) e poi torni all'elaborazione.
Penso che internamente la vecchia Yield() di Windows 3.x facesse una
cosa del genere.
---
Bye! Lorenzo Lutti
http://antani.virtualave.net/

 thread separato),[CUT...]
Come si fa a creare un thread separato? E' difficile?
E' una cosa che mi interessa moltissimo...
Mi basta anche solo che mi consiglio qualche mex su cui si sia discussa
la cosa (tengo tutti i mex da aprile 2000 :) )
Bow-wow
Killer

 Come si fa a creare un thread separato? E' difficile?
Anzi, e` facilissimo, basta una singola chiamata a CreateThread().
Qualcosa del genere:
...
DWORD pid;
CreateThread( NULL, 0, threadProc, (LPVOID)hListCtrl, 0, &pid);
...
hListCtrl e` l'handle del tuo list control. Poi ti basta
dichiarare/definire la funzione che sara` eseguita nel thread:
DWORD WINAPI threadProc( LPVOID param)
{
    HWND hListCtrl = (HWND)param;
    [qui inserisci tutte le operazioni lunghe]
    return 0;
}
Ovviamente ci sono un sacco di migliorie che si possono apportare, ma
per cominciare va bene questo.


 per cominciare va bene questo.
Domani mattina ci provo :)
Ma se apro un nuovo thread, i menu continueranno a funzionare o c'e' un modo
per bloccare l'input al dialogo ?
Grazie tante
Killer

Penso sia un processo "parallelo" a quello che gestisce la finestra, ho azzeccato?
si all'incirca se per processo consideriamo un "percorso" (contesto)
di esecuzione...  un processo nella terminologia win32 e' l'enviroment
(in termini di spazio di indirizzamento, handles table , risorse in
generale, etc..) in cui sono eseguiti uno o piu' threads... nel
messaggio
Saluti,
 
 Walker Boh

 per bloccare l'input al dialogo ?
Si`, continuera` a funzionare tutto esattamente come se non esistesse il
thread. Con "ci sono un sacco di migliorie da fare" mi riferivo proprio
a questi problemi, in particolare al blocco degli elementi di
interfaccia che non possono/devono essere usati durante l'esecuzione del
thread.
Di solito il problema si risolve disabilitando con EnableWindow() i
pulsanti/menu che non devono essere usati, e riabilitandoli alla fine
del thread. Pensaci, ci sono moltissime applicazioni che fanno cosi`, e`
il modo piu` elegante o perlomeno quello piu` standard...


 il modo piu` elegante o perlomeno quello piu` standard...
Bha, quando il mio OutlookExpress carica l'elenco dei messaggi dall'HD
(e questi sono molti :)) s'impalla come s'impalla la mia applicazione, cioe'
non risponde + ai vari messaggi mentre carica, ma alla fine del caricamento.
Forse la Microsoft non rispetta i suoi stessi standard :))))
Cmq, grazie tantissime :)
Ho risolto questo problema e, cosa MOLTO piu' importante, ho imparato
qualcosa che usero' spesso in seguito :)
Bow-wow
Killer