|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Jun 2020
Messaggi: 50
|
[C#] Incrementare una ProgressBar da un altro Thread
Buongiorno,
ho fatto un programmino in "Win Form" con Visual Studio 2019. Questo programmino posta sui gruppi Facebook tramite "Selenium + Chrome Driver", quindi apre un Browser e simula tutti i passaggi umani. Ho fatto il "Form1" quindi l'interfaccia utente dove si realizza il post e si seleziona i gruppi dove postare, attraverso un nuovo Thread avvio una nuova istanza di "Chrome Driver", quindi mi si apre il browser e inizia tutte le procedure, login, post, etc... Tra i vari controlli ho una ProgressBar alla quale non riesco ad applicare l'avanzamento dall'altro Thread, ho letto la guida ufficiale MSN ma la struttura del mio programma non è come nell'esempio e non riesco ad interpretarla per me. la mia struttura è cosi: Form1: Interfaccia Utente, dove c'è la ProgressBar. Codice:
private Browser oBrowser = new Browser(); public Form1() { InitializeComponent(); } private void BtnLogin_Click(object sender, EventArgs e) { th = new Thread(new ThreadStart(Login)) { ApartmentState = ApartmentState.STA }; th.Start(); } private void Login() { //Apro il Browser oBrowser.OpenBrowser(wbHidden); //Faccio Login su Facebook if (oBrowser.Login(txtUser.Text, txtPass.Text)) { //Controllo se sono loggato if (!oBrowser.CheckLogin()) { MessageBox.Show("Username o Password sbagliati", "Attenzione!", MessageBoxButtons.OK, MessageBoxIcon.Warning); } else { //Login effettuato } } } Codice:
class Browser : File { public bool Login(string _username, string _password) { //codice ..... myProgBar.PerformStep(); //codice ..... myProgBar.PerformStep(); //codice ..... myProgBar.PerformStep(); } } Vi ringrazio molto. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Aug 2003
Messaggi: 1174
|
Devi chiamare Invoke dal controllo che è ospitato nel thread della UI.
Questo dalla documentazione ufficiale: https://docs.microsoft.com/it-it/dot...e?view=net-5.0 Da dove arriva Invoke? E' presente nella classe Control che tutti i controlli di Winforms implementano. Prendendo il tuo codice quindi diventerebbe: Codice:
myProgBar.Invoke(delegato) Possiamo usare un delegato anonimo, facendo il cast su MethodInvoker che è un delegato che corrisponde al nostro caso. Codice:
myProgBar.Invoke((MethodInvoker) delegate {myProgBar.PerformStep(); }) Codice:
public void DoProgress() { if (InvokeRequired) { Invoke((MethodInvoker)delegate{ myProgBar.PerformStep();}); } else { myProgBar.PerformStep(); } } Come risolvere? Usando un metodo di estensione, la cui documentazione è cui: https://docs.microsoft.com/it-it/dot...ension-methods Il tuo metodo di estensione sarà molto simile all'esempio precedente: Codice:
static public void SafeExecute(this Control control, Action codice) { if (control.InvokeRequired) { control.Invoke(codice); } else { codice(); } } Codice:
myProgBar.SafeExecute(() => myProgBar.PerformStep());
__________________
VENDITORI ONESTI: krieger, Corrente Elettrica, Cina.Z, Poliacido, Fedemike82, Lucas01, rikop, SystemR89 VENDITORI DA EVITARE: Ancora nessuno ![]() Ultima modifica di antonio338 : 25-01-2021 alle 21:55. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:32.