PDA

Visualizza la versione completa : [Borland C++] gestione thread


Kreator
10-11-2004, 13:39
Ciao raga.

Sto scrivendo un protocollo di comunicazione all'interno di un thread mediante il winsock.
Nel Main principale mi sono creato un oggetto Memo nel quale vado a scrivere lo stato delle operazioni eseguite sulla socket.
Il problema e' questo:
Per sincronizzare le scritture sul campo memo, ovvero il thread dove scrivo il winsock con il thread main, necessito per forza del metodo synchronize ().
Ora, e' possibile passare dei parametri dentro il metodo Synchronize ????
Da quello che mi risulta non e' possibile, c'e' un modo ??
Tipo:

void __fastcall THServiceThread::Execute ()
{
// inizializzazione socket
...
Synchronize (UpdateMemo(IntToStr(GetNumberOfClients())));
...
...
}

void __fastcall THServiceThread::UpdateMemo (AnsiString AValue)
{
Memo1->Lines->Add (AValue);
}

Altrimenti mi tocca adoperare tutte variabili globali al thread.
C'e' qualcuno che mi puo' aiutare ???
Grazie.

:dh˛: :dh˛: :dh˛: :dh˛:

alka
10-11-2004, 13:52
La soluzione Ŕ molto semplice: Ŕ sufficiente che tu inserisca un nuovo metodo senza parametri (compatibile con la forma essenziale del metodo richiesto da Synchronize) in cui richiami il metodo parametrico specificando appunto i parametri.

Kreator
10-11-2004, 15:00
oddio, aiuto .. :confused:
mi potresti fare un esempio per favore ?

alka
10-11-2004, 15:07
Purtroppo non lavoro in C++, ma cercher˛ di descrivere meglio la soluzione.

Invece di richiamare la Synchronize passando come parametro il metodo UpdateMemo, crei un nuovo metodo (ad esempio, chiamato genericamente Update) che passerai al posto di UpdateMemo alla Synchronize.

Nel metodo Update creato di fresco, che Ŕ senza parametri, inserisci una chiamata alla tua UpdateMemo passando invece i parametri che quest'ultimo richiede (la stringa).

Sostanzialmente, si tratta di un semplice raggiro del problema: la Synchronize accetta solo metodi senza parametri? Allora tu ne crei uno che a sua volta chiama il metodo con parametri passando i valori richiesti; questo metodo Ŕ quello che viene passato alla Synchronize.

Kreator
10-11-2004, 15:43
asp, forse mi sono spiegato male.
Mi spiego con un esempio.
Applico quello che mi hai detto ad un esempio.

void __fastcall TFServiceFile::Execute ()
{
// inizializzazione socket
...
AnsiString stringa; // stringa locale alla funzione

Synchronize (Update)


}

void __fastcall TFServiceFile::Update ()
{
UpdateMemo (stringa);
}

void __fastcall TFServiceFile::UpdateMemo (AnsiString AValue)
{
Memo1->Lines->Add (AValue);
}

Ok, credo che fin qui ci siamo.
Quello che non riesco a capire, e' come faccio a passare la variabile 'stringa' alla funzione Update () per mezzo della Synchronize che non ha parametri ???
Scusami ma non ho capito.

:dh˛: :dh˛:

alka
10-11-2004, 15:58
Originariamente inviato da Kreator
Quello che non riesco a capire, e' come faccio a passare la variabile 'stringa' alla funzione Update () per mezzo della Synchronize che non ha parametri ???

Ok, mancava una parte nel ragionamento.

Trasformi la stringa da variabile locale a campo della classe, affinchŔ sia disponibile a tutti i metodi che appartengono alla classe del thread, appunto, e memorizzi in tale stringa il testo che vuoi successivamente aggiungere al controllo Memo quando richiami Synchronize, a cui passi un semplice metodo in grado di inserire tale stringa di testo - giÓ inizializzata - nella proprietÓ Lines.

Kreator
10-11-2004, 16:06
ok.
Praticamente traferisco la dichiarazione della variabile 'stringa' nelle sezione private della classe e a quel punto diventerebbe visibile a tutti i membri della classe stessa.
Ok ricevuto, grazie.
Lo provo subito.
Ciaoo.

:ciauz:

Loading