[c++] Svolgere due funzioni contemporaneamente

martedì 03 agosto 2010 - 20.19
Tag Elenco Tags  .NET 3.5  |  Windows Vista  |  Visual Studio 2008

Doch88 Profilo | Newbie

Ciao a tutti, avrei bisogno del vostro aiuto su un mio problema...
Ho bisogno di svolgere due azioni contemporaneamente, solo che su Windows Form non riesco a utilizzare i Thread perchè appena lo apre si blocca tutto, e con il backgroundWorker non penso faccia al mio caso, perchè ho bisogno che quello che dovrebbe essere un thread svolge le sue funzioni su un ciclo, cioè deve fare molte volte la stessa azione automaticamente...
Potete aiutarmi?
Questa è la parte del source interessata:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Questa è la parte di codice interessata, appena apre FormSecondario, tutto il programma si blocca...
Ho provato anche a cercare di implementare questo: http://support.microsoft.com/kb/815805/it ma non ci riesco...

Vi ringrazio in anticipo,
Doch88

PS: ho ripostato qui, perchè dove avevo postato prima non mi sembrava la sezione più adatta:
http://www.dotnethell.it/forum/messages.aspx?ThreadID=36411

Doch88 Profilo | Newbie

ora ho cambiato con :
Thread ^tred = gcnew Thread(gcnew ThreadStart (ThreadProcer)); tred->Start();
quindi il problema ora è un altro:
public: static void ThreadProcer()//Thread { while(1){ Sleep(1300); if(progress->Value <= (progress->Maximum - pg->value)) pg->value2 += (pg->value); else if(progress->Value >= (progress->Maximum - pg->value)) pg->value2 = 100; if(progress2->Value <= (progress2->Maximum - even_attuale->value)) even_attuale->value2 += (even_attuale->value); else if(progress2->Value >= (progress2->Maximum - even_attuale->value)) even_attuale->value2 = 100; progress->Value = pg->value2; progress2->Value = even_attuale->value2; } }

(progress e progress2 sono progressBar invece pg e even_attuale sono due oggetti di una classe creata da me)

avendo una funzione static, non riesco ad usare gli elementi del form (come la progressBar e la label) ...
Come posso risolvere questo problema?
Grazie per eventuali risposte,
Doch88

Doch88 Profilo | Newbie

aspetto risposte...

aiedail92 Profilo | Expert

Ciao,

Basta che rendi la funzione non statica, quindi richiami il thread in questo modo:

ThreadStart^ threadDelegate = gcnew ThreadStart(this, &FormSecondario::ThreadProcer); Thread^ newThread = gcnew Thread(threadDelegate); newThread->Start();

Luca

Doch88 Profilo | Newbie

Ok, grazie per l'aiuto
Un'ultima domanda:
progress->Value = pg->value2; progress2->Value = even_attuale->value2;
in questo punto mi fa la seguente eccezione:

System.InvalidOperationException:
Operazione cross-thread non valida: è stato eseguito l'accesso al controllo 'progress' da un thread diverso da quello da cui è stata eseguita la creazione.

Come posso risolvere?
Grazie per eventuali risposte,
Doch88

aiedail92 Profilo | Expert

È un problema di cui si è parlato molto, anche qui sul forum.

Puoi guardare questa pagina, ci sono gli esempi anche in C++: http://msdn.microsoft.com/en-us/library/ms171728.aspx

In alternativa puoi spulciare i vecchi thread che trattano l'argomento: http://www.google.it/#hl=it&q=operazione+cross-thread+non+valida+site%3Awww.dotnethell.it

Luca

Doch88 Profilo | Newbie

con msdn facendo questo:
SetTextDelegate^ d = gcnew SetTextDelegate(this, &FormSecondario::Function);

oppure questo (Function è il nome della funzione che ho creato...):
FunctionDelegate^ d = gcnew FunctionDelegate(this, &FormSecondario::Function);

mi dice "identificatore non dichiarato"...
invece col secondo link, sono quasi tutti in VB e non ci capisco molto...
Puoi aiutarmi?
Grazie,
Doch88

Doch88 Profilo | Newbie

lol l'ho risolto da solo
Grazie per il tuo aiuto Luca

aiedail92 Profilo | Expert

Perfetto

Luca
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5