|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Registered User
Iscritto dal: Mar 2011
Messaggi: 72
|
[VB] Processo blocca il caricamento del form
Salve a tutti!
Sto sviluppando un software che al caricamento del form principale deve avviare in sequenza una serie di software. In sostanza è una specie di installer. Il problema che mi si presenta però è che i programmi vengono avviati prima che il form venga mostrato. Posto il codice: Codice:
Imports System.Diagnostics Public Class Form1 Dim TotalAppsAmount As Integer Private Function GetAppsNumber() As Integer 'Funzione che conta il numero di applicazioni da installare Dim Num As Integer Dim i As Integer = 0 Dim CurrentAppPath As String Dim CurrentAppName As String Do While i <= 50 CurrentAppPath = IniRead(Application.StartupPath & "\SETTINGS.ini", "Software", "Path" & i) CurrentAppName = IniRead(Application.StartupPath & "\SETTINGS.ini", "Software", "Name" & i) If CurrentAppPath <> "" Then Num += 1 Else Exit Do End If i += 1 Loop Return (Num) End Function Private Sub InstallApps(ByVal AppsAmount As Integer) Dim AppName As String Dim AppPath As String Dim j As Integer = 0 Do While j <= AppsAmount AppName = IniRead(Application.StartupPath & "\SETTINGS.ini", "Software", "Name" & j) AppPath = IniRead(Application.StartupPath & "\SETTINGS.ini", "Software", "Path" & j) lbl_app_name.Text = AppName lbl_app_name.Anchor = AnchorStyles.None lbl_app_amount.Text = "Installazione" & " " & j & " " & "di" & " " & AppsAmount Process.Start(AppPath) pbr_installation.Value += 1 j += 1 Loop End Sub Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load TotalAppsAmount = GetAppsNumber() pbr_installation.Minimum = 0 pbr_installation.Maximum = TotalAppsAmount InstallApps(TotalAppsAmount) End Sub End Class Inoltre ho un secondo problema. Utilizzando il Process.Start le applicazioni mi vengono aperte tutte in contemporanea. C'è un modo alternativo per far avviare un'applicazione SOLO se quella precedente è stata chiusa? Ho provato a fare come spiegato in questo articolo ma non funziona: http://support.microsoft.com/kb/305368/it Come posso fare? Grazie in anticipo ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
L'evento load viene generato prima che il form venga visualizzato, puoi forzarne la visualizzazione invocando il metodo show prima di iniziare l'elaborazione, oppure puoi iniziare l'elaborazione dopo che il form è stato visualizzato inserendo il codice nell'evento shown invece che load.
Per quanto riguarda l'esecuzione sincrona dei programmi, se non vuoi che il form si blocchi devi seguire una di queste due strade: 1) inserire il codice in un thread; 2) gestire i processi in maniera asincrona con delle callback. |
![]() |
![]() |
![]() |
#3 |
Registered User
Iscritto dal: Mar 2011
Messaggi: 72
|
Ok per la prima parte della domanda ho risolto facendo come hai detto tu usando Me.Show()
Per la seconda parte quindi uso un BackgroundWorker e da li faccio avviare tutti i processi? Faccio un copia/incolla diretto del codice della sub InstallApps nel DoWork del BackgroundWorker o c'è qualche modifica in particolare che devo fare? (Eccetto aggiungere gli eventi ProgressChanged e RunWorkerCompleted) |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Dovrebbe essere sufficiente, fai una prova, se ci sono problemi vediamo.
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:15.