|
|||||||
|
|
|
![]() |
|
|
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 22:55. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:15.



















