Newsgroup: it.comp.programmare.win32
Titolo: [VC6] comunicazioni tra CWinThread

avrei un piccolo problema...spero qualcuno gentilmente mi possa
illuminare :) ecco la situazione:
all'interno del mio programma ho vari thread attivi derivati da
CWinThread adesso vorrei dal thread principale (main) inviare un
messaggio ad un thread B per fare partire un metodo di B.
cercando un po' su MSDN ho trovato che devo mappare i metodi ai
messaggi che possono essere ricevuti da B in questo modo:
...nella dichiarazione..:
..
protected:
	DECLARE_MESSAGE_MAP()
..
...nell'implementazione..:
..
BEGIN_MESSAGE_MAP(MiaClasseDerivataThread,CWinThread)
    ON_THREAD_MESSAGE(MSG_CIAO, mioMetodo)	
END_MESSAGE_MAP()
..
dove mioMetodo e' un metodo membro della classe thread B
(MiaClasseDerivataThread) con il seguente prototipo:
    void memberFxn( UINT, LONG );
anche se non ho capito a cosa servono questi parametri cmq e' cio' che
ho fatto ...
mando il messaggio al Thread B cosi: 
ptrThreadB->PostThreadMessage(MSG_CIAO,0,0);
MSG_CIAO l'ho gia' definito a monte con #define MSG_CIAO 138955
il programma viene eseguito ma nn mi sembra che venga chiamato il
metodo di B oppure recepito il messaggio spedito.. :(  :(
qualcuno ha qualcosa da suggerirmi... ? dimentico qcosa? ..nn so piu'
dove sbattere la testa !!
grazie in anticipo x ogni eventuale risposta :)
Chucky.


Cosě a naso mi sembra tutto corretto....i tuoi thread cosa fanno ?
Hanno un'interfaccia grafica ?
Fanno lunghe elaborazioni ?
Porlock

Hanno un'interfaccia grafica ?
no.
cmq oggi mi sono reso conto che i messaggi non vengono spediti
affatto! xke'  la PostThreadMessage(....) mi ritorna 0... !!! ?!?!
thr2->PostThreadMessage(138955,0,0);
proprio nn capisco ^^^^ cioe' e' esattamente quel che ho scritto.
thr2 e' il ptr (non e' nullo) al Thread a cui mando il messaggio.. ma
il risultato del metodo e' sempre 0 !  :(  xke' ??!
non e' che sapresti dove posso trovare un esempio di codice che faccia
al mio caso ? ..su MSDN ho gia' cercato ma nn ho trovato nulla o forse
nn ho saputo cercare !
Chucky.

 il risultato del metodo e' sempre 0 !  :(  xke' ??!
....e GetLastError cosa ti ritorna ?
Porlock

Cioč ? Sono worker thread ?
no no sono delle classi derivate da CWinThread..
cmq dopo "approfonditi" studi sugli UI-Thread e i Worker-Thread....
...mi sono reso conto di una cosa:
#define MSG_CIAO 138955
il msg ID deve essere un UINT e 138955 e' un po' troppo grande per
esser un UINT !  :-|	:) :)
per un'attimo ho pensato che la mia classe derivata doveva per forza
avere un' interfaccia grafica per avere una "message pump" ! Cmq
adesso Funziona (mettendo un ID piu' piccolo), anche se ho notato che
Spy++ non mi vede questo messaggio e nemmeno gli altri come WM_QUIT...
sara' un bug di Spy++ che non riesce proprio ad individuare tutti i
messaggi lanciati ai thread oppure una mia ignoranza ?!?!  ...
cmq grazie x l'attenzione dedicato al mio problema  :)
ciao.
Chucky.

 messaggi lanciati ai thread oppure una mia ignoranza ?!?!  ...
mi sembra alquanto strano che ora funzioni e prima no... O_o
devi aver cambiato anche qualche altra cosa oltre all'ID!
e cmq Spy++ dovrebbe mostrare il messaggio come unknown (da quello che mi
ricordo); forse il suo filtro lo filtra perché non hai selezionato tutti i
messaggi...
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 di 138955
il tipo UINT occupa 32 bit, giusto?


Ciao, Chucky!
Il giorno 15/12/2003 alle ore 02:46 hai scritto:
 C> MSG_CIAO l'ho gia' definito a monte con #define MSG_CIAO 138955
Esiste un messaggio, WM_USER, che deve essere utilizzato per definire
messaggi proprietari non standard. Il metodo corretto per definire un nuovo
messaggio sarebbe questo:
#define MSG_CIAO   WM_USER+1
Ti evitera' problemi.
Bye

messaggi...
ho selezionato tutti i messaggi che arrivano anche quelli unknown.. ma
niente ! boh..  poi col tempo vedro' se e' una cosa particolare di
questo prog o altro..
grazie, ciao :)
Chucky.

il tipo UINT occupa 32 bit, giusto?
si si, provato empiricamente.. (<---- si puo' dire ??!)
 :)
Chucky.

Bye
ciao,
Chucky.

davvero strabiliante ! O_O
   La documentazione ufficiale Microsoft dice che:
    "Values in the range 0x0400 (the value of WM_USER) through 0x7FFF
     are available for message identifiers for private window
     classes."
   21211 (0x52DB) e` (casualmente?) in quest'intervallo,
eventualmente:
    "If your application is marked version 4.0, you can use message-
     identifier values in the range 0x8000 (WM_APP) through 0xBFFF for
     private messages."
   Inoltre, nella documentazione relativa al campo `message' della
struttura `MSG' si legge:
    "message
     Specifies the message identifier. Applications can only use the
     low word; the high word is reserved by the system."
   In pratica, la high word del tuo messaggio dovrebbe essere pari a
zero, invece e` pari a 2 (138955 = 0x21ECB -> 0002-1ECB).
   Quanto segue e` solo per chi apprezza le insolite conseguenze
dell'abuso di macro del preprocessore (io ci vedo una vaga
similitudine col caso in discussione, ma magari mi sbaglio):
   Una volta c'era un tizio che chiamava dalla sua applicazione un
processo esterno, passandogli dei parametri da linea di comando, e
prendeva decisioni diverse, a seconda del valore di ritorno di quel
processo, che otteneva con GetExitCodeProcess. Occasionalmente il
processo esterno restituiva 259, che disgraziatamente corrisponde a
STILL_ACTIVE (ovvero a STATUS_PENDING), convincendo il chiamante di
GetExitCodeProcess che il processo fosse ancora in esecuzione.
-- 
S.L.

 wrote:
[..]
Grazie per tutte le precisazioni :)
molto gradite
ciao
Chucky.