Newsgroup: it.comp.lang.c++
Titolo: Bottoni "multitasking"

Ho una form con due speedbutton (ma dovrebbe valere per qualsiasi
elemento, immagino). Faccio il doppio click sul primo button e scrivo
il codice dell'evento Click relativo a quel bottone. Faccio
altrettanto con il secondo bottone. Adesso, quello che vorrei
ottenere, è utilizzare il secondo bottone per interrompere il codice
scritto per il primo. Qual è la strategia che devo utilizzare? Ho
visto che una volta avviato il codice dell'evento click del primo
pulsante, il programma disabilita la rilevazione di ogni altro evento,
fino a che il codice non è stato completato. Come posso fare, almeno
in linea teorica? Immagino che esista qualcosa di simile
all'esecuzione "non modale" del codice di un evento. Possibile?
PS.Uso Borland Builder c++
Grazie anticipatamente =:-)


Perdonami, ma non riesco bene a capire cosa vuoi fare.
Cosa intendi per interruzione del codice?


Non conosco C++ builder (me tapino!) e sono quindi costretto a fornirti una
spiegazione più "generica", spero di essere comunque di aiuto.
Ogni programma windows che utilizza elementi di interfaccia utente è dotato
di uno o più loop di messaggi (generalmente uno solo nel thread principale).
Alcune funzioni (DialogBox e MessageBox) "nascondono" al loro interno un
loop di messaggi; le librerie tipo MFC (e credo le librerie di c++ builder)
o i RAD (visual basic e delphi) consentono agli sviluppatori di focalizzare
la loro attenzioni sugli oggetti visuali e nascondono la struttura del
programma (che deve essere comunque eseguito sequenzialmente).
Generalmente un loop dei messaggi è strutturato nel modo seguente:
-lettura di un messaggio (GetMessage/PeekMessage)
-eventuale "traduzione" del messaggio (TranslateMessage/IsDialogMessage)
-"dispatch" del messaggio, in base all'HWND cui è indirizzato, alla WndProc
che provvede a eseguire il codice associato al messaggio stesso.
-ritorno alla lettura di un nuovo messaggio
Nel tuo caso, quando il pulsante viene premuto viene messo in coda un
messaggio (WM_COMMAND?) indirizzato alla finestra che contiene il pulsante;
le librerie di C++ Builder provvedono, quando viene ricevuto il suddetto
messaggio, a richiamare la tua funzione. L'applicazione non leggerà nuovi
messaggi finchè non sarà terminata l'esecuzione della funzione di cui sopra
e quindi la selezione del secondo pulsante verrà ignorata.
Se, in risposta alla selezione del famigerato pulsante, devi eseguire
operazioni che durano diversi secondi (come mi fa supporre la presenza del
pulsante di abort), dovresti considerare la possibilità di eseguire il
codice in un thread creato all'uopo (CreateThread, in termini di Win API).
Questo comporta sicuramente problemi di sincronizzazione nell'accesso ai
dati che sono condivisi tra il programma principale ed il nuovo thread e la
necessità di segnalare al secondo thread (tramite un flag, un evento di
sincronizzazione o quantaltro) la necessità di abortire l'operazione.
---
Valter Minute
min...@fortech.it
 (the reply address is invalid because I'm not looking for
latest Pam Anderson's videos, cheap CD-ROMs or "how to make a lot of $$$ by
spam" messages)
www.fortech.it/english
---
Are you looking for a good freeware ScreenSaver? Try FOYD!
http://www.winsite.com/info/pc/win95/desktop/foyd1295.zip/
if you want, I can send you the (free) C++ source code.

Potresti provare ad usare una variabile Boolean che controlli se il secondo
bottone e' stato premuto e che venga usata dal primo bottone.
Ex:
nel codice relativo al click dek primo bottone,inserisci in mezzo al loop
principale un IF che controlla il valore di STOP (booleano) ed in caso sia a
true,fermi il ciclo.
Nel codice relativo al click del secondo bottone,setti semplicemente STOP a
True.
Non sara' elegante,ma funziona :)
Ciao
Daniele Maiorana
maio...@solnet.it

 Grazie
Be, non volevo accusarti di "cattiva espessione", ma spesso per
la fretta di scrivere il nocciolo si perdono i dettagli importanti!
Passo alla soluzione:
All'interno del ciclo for applica la seguente istruzione:
Application->ProcessMessage() 
(Guarda bene nell'help per l'esatto nome!)
Ricorda che quando esegui un ciclo, potresti tenere in ostaggio
il Sistema Operativo. E' necessario che di tanto in tanto
il SO dia retta anche alle altra applicazioni o processi.
A presto, oswald.cpp