Pagina 1 di 6 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 58
  1. #1

    [C#] Modicare un campo textBox da Thread esterno

    Il mio problema è questo:

    Ho un Thread che parte quando clikko su un pulsante e che fà ciclicamente delle operazioni standard. Durante queste operazioni ho l'esigenza di stamparmi delle informazioni su un campo textBox della form principale.

    Come posso passare queste stringhe alla mia form principale?


    Grazie in anticipo!

  2. #2
    Utente di HTML.it L'avatar di albgen
    Registrato dal
    Jun 2005
    Messaggi
    3,249
    basta chiamarlo da thread
    I got the remedy

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Originariamente inviato da Killex
    Ho un Thread che parte quando clikko su un pulsante e che fà ciclicamente delle operazioni standard. Durante queste operazioni ho l'esigenza di stamparmi delle informazioni su un campo textBox della form principale.
    Come posso passare queste stringhe alla mia form principale?
    Potresti rendere disponibili queste informazioni attraverso un oggetto condiviso, con tutti i controlli necessari di sincronizzazione dell'accesso alla risorsa (se servono), e andare a leggere tale oggetto dal Form principale, ad esempio estraendo le informazioni da visualizzare, mentre il thread si occupa di invocarne i metodi che consentono di inserire tali informazioni al suo interno.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  4. #4
    basta chiamarlo da thread
    ho provato ma mi dice che non ho i permessi

    Originariamente inviato da alka
    Potresti rendere disponibili queste informazioni attraverso un oggetto condiviso, con tutti i controlli necessari di sincronizzazione dell'accesso alla risorsa (se servono), e andare a leggere tale oggetto dal Form principale, ad esempio estraendo le informazioni da visualizzare, mentre il thread si occupa di invocarne i metodi che consentono di inserire tali informazioni al suo interno.

    Ciao!
    Potresti mettermi del codice di esempio? (un thread che ogni tot stampa qualcosa nel texBox) ciuz

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Originariamente inviato da Killex
    ho provato ma mi dice che non ho i permessi
    Infatti, è il problema iniziale.

    Originariamente inviato da Killex
    Potresti mettermi del codice di esempio? (un thread che ogni tot stampa qualcosa nel texBox)
    Hai letto la mia risposta? Non è così banale scrivere tutto quello che ho detto... prova a realizzare qualcosa tu, seguendo le indicazioni, ed eventualmente poi lo esaminiamo se non funziona. C'ho da lavorare anche io...
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  6. #6
    Utente di HTML.it L'avatar di albgen
    Registrato dal
    Jun 2005
    Messaggi
    3,249
    se non hai problemi di sincronizzazione potresti fare cosi':
    nel costruttore del form inserisci CheckForIllegalCrossThreadCalls = false;
    e potrai utilizzare la textbox semplicemente chiamando il nome...

    ecco un semplice esempio:

    codice:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    
    namespace thread_prova
    {
        public partial class Form1 : Form
        {
    
            public void threadcodice() 
            { 
                textBox1.Text = "sss"; 
            }
    
            public Form1()
            {
                CheckForIllegalCrossThreadCalls = false;
                InitializeComponent();
                ThreadStart ts = new ThreadStart(threadcodice);
                Thread tr = new Thread(threadcodice);             
                tr.Start();
            }
        }
    }
    I got the remedy

  7. #7
    Originariamente inviato da albgen
    se non hai problemi di sincronizzazione potresti fare cosi':
    nel costruttore del form inserisci CheckForIllegalCrossThreadCalls = false;
    e potrai utilizzare la textbox semplicemente chiamando il nome...
    Non è un metodo molto ortodosso... dai un'occhiata a questa discussione e alla stessa documentazione MSDN, in particolare a questo passo:
    When a thread other than the creating thread of a control tries to access one of that control's methods or properties, it often leads to unpredictable results. A common invalid thread activity is a call on the wrong thread that accesses the control's Handle property. Set CheckForIllegalCrossThreadCalls to true to find and diagnose this thread activity more easily.
    .
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it L'avatar di albgen
    Registrato dal
    Jun 2005
    Messaggi
    3,249
    Originariamente inviato da MItaly
    Non è un metodo molto ortodosso... dai un'occhiata a questa discussione e alla stessa documentazione MSDN, in particolare a questo passo:
    .
    la documentazione di msdn per quella proprietà non spiega niente,
    dice che ci spossono essere problemi ma non ti indica il tipo.
    secondo me intendono che utilizzando quella proprietà ottieni un atteggiamento non prevedibile(unpredictable results) in quanto non hai accessi sincronizzati.
    Se l'applicazione ha un solo thread che lavora su quel controllo(oltre a quello che lo ha creato) non hai problemi, nel senso che tutte le proprietà del controllo e i metodi li utilizzi solo da un thread e quindi non hai problemi di "race condition".
    Ovviamente il discorso cambia se tu hai tanti thread che lavorano su un oggetto, per es leggendo o scrivendo sulle proprietà o chiamano metodi che cambiano lo stato dell'oggetto.
    In questo caso bisogna fare una progettazione ad hoc tenendo conto di tutti i casi possibili...
    I got the remedy

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Originariamente inviato da albgen
    la documentazione di msdn per quella proprietà non spiega niente,
    dice che ci spossono essere problemi ma non ti indica il tipo.
    Il tipo di problemi che puoi avere è scontato: l'accesso da più thread rischia di lasciare l'oggetto in una situazione non consistente quando un thread viene bloccato e un altro riprende la sua esecuzione. Le classi che incapsulano i controlli visuali di WinForms non hanno codice di protezione, oltre a dove è espliciticamente indicato il contrario, e pertanto sono soggette a questo problema.

    La proprietà aiuta a diagnosticare il problema nel caso in cui si abbia il sospetto che uno o più thread accedano ad un controllo con le modalità descritte sopra, causando comportamenti imprevisti, permettendo quindi di diagnosticare il problema.

    L'unico e solo dato di fatto è uno: non si accede da più thread ai controlli visuali, non senza i meccanismi di sincronizzazione dell'accesso alle risorse.

    Originariamente inviato da albgen
    secondo me intendono che utilizzando quella proprietà ottieni un atteggiamento non prevedibile(unpredictable results) in quanto non hai accessi sincronizzati.
    Gli accessi ai controlli visuali da più thread sono sempre *non sincronizzati*, poiché semplicemente i controlli sono fatti così.

    La proprietà aiuta solamente a diagnosticare i problemi che possono nascere, dovuti a questo fatto che, come detto sopra, c'è e permane.

    Originariamente inviato da albgen
    Se l'applicazione ha un solo thread che lavora su quel controllo(oltre a quello che lo ha creato) non hai problemi, nel senso che tutte le proprietà del controllo e i metodi li utilizzi solo da un thread e quindi non hai problemi di "race condition".
    Questo è fuori discussione, ma nel caso in esame abbiamo due thread che accedono alla stessa risorsa, quindi c'è una "race condition", ed è necessario sincronizzare l'accesso.

    Originariamente inviato da albgen
    Ovviamente il discorso cambia se tu hai tanti thread che lavorano su un oggetto, per es leggendo o scrivendo sulle proprietà o chiamano metodi che cambiano lo stato dell'oggetto.
    In questo caso bisogna fare una progettazione ad hoc tenendo conto di tutti i casi possibili...
    Bastano anche due soli thread, come nel caso in esame, per richiedere la sincronizzazione dell'accesso ad una risorsa.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  10. #10
    Utente di HTML.it L'avatar di albgen
    Registrato dal
    Jun 2005
    Messaggi
    3,249
    sostanzialmente hai spiegato più in dettaglio quello che ho scritto io...

    ma per questo punto
    Originariamente inviato da alka ....
    Questo è fuori discussione, ma nel caso in esame abbiamo due thread che accedono alla stessa risorsa, quindi c'è una "race condition", ed è necessario sincronizzare l'accesso....
    il primo lo crea e basta !!!
    quindi non è una situzione cosi' critica...la può benissimo usare...
    I got the remedy

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.