|
|||||||
|
|
|
![]() |
|
|
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: 05:48.



















