Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di Kreator
    Registrato dal
    May 2002
    Messaggi
    278

    [Borland C++] gestione thread

    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.


  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    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.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it L'avatar di Kreator
    Registrato dal
    May 2002
    Messaggi
    278
    oddio, aiuto ..
    mi potresti fare un esempio per favore ?

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    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.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Utente di HTML.it L'avatar di Kreator
    Registrato dal
    May 2002
    Messaggi
    278
    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.


  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    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.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Utente di HTML.it L'avatar di Kreator
    Registrato dal
    May 2002
    Messaggi
    278
    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.


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.