Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - c++ thread e wait
Forum - C/C++ - c++ thread e wait

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
matrix_denny (Normal User)
Newbie


Messaggi: 10
Iscritto: 02/10/2011

Segnala al moderatore
Postato alle 17:30
Lunedì, 24/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++

  1. CWinThread* pThread = AfxBeginThread(PKCoThread, this);
  2. WaitForSingleObject(pThread->m_hThread, INFINITE);
  3. MessageBox("terminato","terminato",MB_OK);
  4.  
  5. UINT CMainFrame::PKCoThread(LPVOID pParam)
  6. {
  7.         MainFrame       *pParent = static_cast<MainFrame*>(pParam);
  8.         ....
  9.         return 0;



Premetto che l'alert appare effettivamente quando il thread ha finito ma prima di finire in pratica non posso fare nulla!!!

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 17:58
Lunedì, 24/10/2011
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à.
PM Quote
Avatar
matrix_denny (Normal User)
Newbie


Messaggi: 10
Iscritto: 02/10/2011

Segnala al moderatore
Postato alle 18:07
Lunedì, 24/10/2011
il problema è appunto come faccio a controllare periodicamente che abbia finito???

es:
Codice sorgente - presumibilmente C/C++

  1. // Start thread
  2. write_log(0,"Ho fatto partire il thread \n");
  3. m_StopThread = CreateEvent(0, TRUE, FALSE, 0);
  4. AfxBeginThread(PKCoThread, this);
  5.  
  6. UINT CMainFrame::PKCoThread(LPVOID pParam)
  7. {
  8.     CMainFrame  *pParent = static_cast<CMainFrame*>(pParam);
  9.     ........
  10.     ::SetEvent(pParent->m_StopThread);
  11. }



Ora come faccio a raccoglierlo?

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 18:41
Lunedì, 24/10/2011
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à.
PM Quote
Avatar
matrix_denny (Normal User)
Newbie


Messaggi: 10
Iscritto: 02/10/2011

Segnala al moderatore
Postato alle 18:52
Lunedì, 24/10/2011
con interfaccia grafica, visualstudio 2010.

PM Quote
Avatar
matrix_denny (Normal User)
Newbie


Messaggi: 10
Iscritto: 02/10/2011

Segnala al moderatore
Postato alle 19:08
Lunedì, 24/10/2011
in un modo ho risolto ... non so se è il migliore però:
Codice sorgente - presumibilmente C#

  1. void CMainFrame::OnClickStartSimulation()
  2. {
  3.         // Start thread
  4.         write_log(0,"Ho fatto partire il thread \n");
  5.         //m_StopThread = CreateEvent(0, TRUE, FALSE, 0);
  6.         pThread = AfxBeginThread(PKCoThread, this);
  7.         AfxBeginThread(PKCoThreadEnd, this);
  8.         //PKCoThread();
  9. }
  10.  
  11. UINT CMainFrame::PKCoThreadEnd(LPVOID pParam)
  12. {
  13.         WaitForSingleObject(pThread->m_hThread, INFINITE);
  14.         write_log(0,"Ho finito il thread \n");
  15.         return 0;
  16. }
  17.  
  18. UINT CMainFrame::PKCoThread(LPVOID pParam)
  19. {
  20.       --------
  21.         .....
  22.         return 0;
  23. }


PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 19:28
Lunedì, 24/10/2011
Non mi pare un modo ...

Tanto valeva

Codice sorgente - presumibilmente C/C++

  1. void CMainFrame::OnClickStartSimulation()
  2. {
  3.         // Start thread
  4.         write_log(0,"Ho fatto partire il thread \n");
  5.         pThread = AfxBeginThread(PKCoThread, this);
  6. }
  7.  
  8. UINT CMainFrame::PKCoThread(LPVOID pParam)
  9. {
  10.       --------
  11.         .....
  12.  
  13.         write_log(0,"Ho finito il thread \n");
  14.         return 0;
  15. }



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à.
PM Quote
Avatar
matrix_denny (Normal User)
Newbie


Messaggi: 10
Iscritto: 02/10/2011

Segnala al moderatore
Postato alle 19:34
Lunedì, 24/10/2011
illuminatemi allora...ho finito le idee.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 20:47
Lunedì, 24/10/2011
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à.
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo