matrix_denny (Normal User)
Newbie
Messaggi: 10
Iscritto: 02/10/2011
|
Salve a tutti ho creato un thread in modo da poter fare delle elaborazioni lasciando libero l'utente di effettuare altre operazioni (ad esempio cliccare sul menù e visualizzare altre info).
Il problema è che quando il thread finisce di effettuare le sue operazioni deve far apparire una messagebox che avverte di aver terminato.
Per questo ho creato una WaitForSingleObject ma purtroppo mi ritrovo di nuovo con l'interfaccia grafica piantata.
Sbaglio qualcosa?
Codice sorgente - presumibilmente C/C++ |
CWinThread* pThread = AfxBeginThread(PKCoThread, this);
WaitForSingleObject(pThread->m_hThread, INFINITE);
MessageBox("terminato","terminato",MB_OK);
UINT CMainFrame::PKCoThread(LPVOID pParam)
{
MainFrame *pParent = static_cast<MainFrame*>(pParam);
....
return 0;
|
Premetto che l'alert appare effettivamente quando il thread ha finito ma prima di finire in pratica non posso fare nulla!!!
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Beh, ovvio, se gli dici di attendere, praticamente hai un solo thread.
Non dovrai usare la WaitForSingleObject e dovari fare in modo che il thread secondario, al termine setti il valore di una variabile che il thread principale andrà periodicamente a controllare. Sarebbe meglio gestire un "evento" ma tutto dipende dal tipo di architettura della tua applicazione.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
matrix_denny (Normal User)
Newbie
Messaggi: 10
Iscritto: 02/10/2011
|
il problema è appunto come faccio a controllare periodicamente che abbia finito???
es:
Codice sorgente - presumibilmente C/C++ |
// Start thread
write_log(0,"Ho fatto partire il thread \n");
m_StopThread = CreateEvent(0, TRUE, FALSE, 0);
AfxBeginThread(PKCoThread, this);
UINT CMainFrame::PKCoThread(LPVOID pParam)
{
CMainFrame *pParent = static_cast<CMainFrame*>(pParam);
........
::SetEvent(pParent->m_StopThread);
}
|
Ora come faccio a raccoglierlo?
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Non intendevo un oggetto Event ma una funzione evento.
Per capire meglio quale soluzione sia la migliore, devi dare maggiori indicazioni circa l'applicazione e gli strumenti di sviluppo usati ...
E' un'applicazione con interfaccia grafica o console? Usi MFC? Usi Visual C++? Quale versione?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
matrix_denny (Normal User)
Newbie
Messaggi: 10
Iscritto: 02/10/2011
|
con interfaccia grafica, visualstudio 2010.
|
|
matrix_denny (Normal User)
Newbie
Messaggi: 10
Iscritto: 02/10/2011
|
in un modo ho risolto ... non so se è il migliore però:
Codice sorgente - presumibilmente C# |
void CMainFrame::OnClickStartSimulation() { // Start thread write_log(0,"Ho fatto partire il thread \n"); //m_StopThread = CreateEvent(0, TRUE, FALSE, 0); pThread = AfxBeginThread(PKCoThread, this); AfxBeginThread(PKCoThreadEnd, this); //PKCoThread(); } UINT CMainFrame::PKCoThreadEnd(LPVOID pParam) { WaitForSingleObject(pThread->m_hThread, INFINITE); write_log(0,"Ho finito il thread \n"); return 0; } UINT CMainFrame::PKCoThread(LPVOID pParam) { -------- ..... return 0; }
|
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Non mi pare un modo ...
Tanto valeva
Codice sorgente - presumibilmente C/C++ |
void CMainFrame::OnClickStartSimulation()
{
// Start thread
write_log(0,"Ho fatto partire il thread \n");
pThread = AfxBeginThread(PKCoThread, this);
}
UINT CMainFrame::PKCoThread(LPVOID pParam)
{
--------
.....
write_log(0,"Ho finito il thread \n");
return 0;
}
|
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
matrix_denny (Normal User)
Newbie
Messaggi: 10
Iscritto: 02/10/2011
|
illuminatemi allora...ho finito le idee.
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
1) con precisione, mi dici che tipo di progetto hai usato?
Applicazione MFC ... ATL ... ?
2) puoi mettere a disposizione lo zip del progetto per controllarlo senza dover perdere tempo a replicare tutto quanto ?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|