PDA

View Full Version : Aprire e gestire + thread in C++


giopappy
27-11-2001, 16:44
Come da titolo, ho la necessità che dalla procedura main partano in parallelo + processi, in pratica tutti uguali (nel senso che chiamo la stessa procedura) ma che agiscono su variabili (e files) diversi che passerei alla procedura chiamata.
Come si fa?
Al momento sto usando le librerie commonc++ (prese da surceforge) ma ho dei problemi nell'ambiente multithreading, infatti i thread si bloccano prima del dovuto, mentre se faccio partire un solo thread allora termina tranquillamente.
Grazie e ciao

ilsensine
27-11-2001, 17:24
Forse hai problemi con il lock di aree di memoria accedute contemporaneamente da più thread...
Non conosco le commonc++, forse dovresti provare altre librerie per vedere se la colpa è delle commonc++ o "tua" ;) (ad es. puoi usare le pthread se lavori in ambiente unix, oppure i thread delle SDL se vuoi una maggiore portabilità).

giopappy
27-11-2001, 18:13
Io lavoro in ambiente windows (sigh!) quali librerie posso usare(possibilmente che abbiano una buona documentazione!)?

cionci
27-11-2001, 19:39
Con le API di Windows hai provato ? Con CreateThread ad esempio....

ilsensine
27-11-2001, 20:56
Le API di Windows sarebbero forse la soluzione migliore. Comunque le SDL ci sono anche per windows, sono state portate su molte piattaforme.

giopappy
27-11-2001, 23:08
Originariamente inviato da cionci
[B]Con le API di Windows hai provato ? Con CreateThread ad esempio....

Mi potresti indicare dove posso prendere della documentazione sull'uso di queste API? Spesso la guida in linea di visual studio non è il massimo in quanto a chiarezza....

cionci
28-11-2001, 07:58
AfxBeginThread è la versione MFC della API CreateThread...ho trovato questo esempio...

UINT MyThreadProc( LPVOID pParam )
{
CMyObject* pObject = (CMyObject*)pParam;

if (pObject == NULL ||
!pObject->IsKindOf(RUNTIME_CLASS(CMyObject)))
return 1; // if pObject is not valid

// do something with 'pObject'

return 0; // thread completed successfully
}

// inside a different function in the program
.
.
.
pNewObject = new CMyObject;
AfxBeginThread(MyThreadProc, pNewObject);
.
.
.

cionci
28-11-2001, 08:14
Per CreateThread :

DWORD WINAPI ThreadProc(LPVOID lpParameter // thread data)
{
  int *i = (int *)lpPrameter;
  ++i;
  return 0;
}

void tuaFunzione()
{

  ....
  ....
  ....

  int i = 0;
  int threadID;

  HANDLE t = CreateThread(NULL, 0, ThreadProc, (void *)&i, 0, threadID);

  ...
  ...
  ...

  int termStatus;
  if(GetExitCodeThread(t, termStatus))
  {
    //c'è stato un errore la frunzione non può essere eseguita
  }
  else
  {
    if(termStatus == STILL_ACTIVE)
    {
      //Il thread sta ancora girando
    }
    else
    {
      //termStatus c'è l'exitCode del thread
    }
  }
}