2010-09-23 3 views
1

Je commence à créer un programme qui va graver des CD/DVD, et tout va bien. J'ai trouvé moyen de graver avec API IMAPI2, mais maintenant j'ai un problème: Je ne peux pas obtenir la barre de progression de cette gravure. Voici le code:Barre de progression IMAPI2 dans VB 2008

Dim CDD1 As New IMAPI2.MsftDiscMaster2 
Dim CDD2 As New IMAPI2.MsftDiscRecorder2 

Dim FSI As New IMAPI2FS.MsftFileSystemImage 
Dim CDD3 As New IMAPI2.MsftDiscFormat2Data 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    Dim Index = 0 
    Dim UniqueID = "" 
    Dim Directory 
    Dim Path = "C:\lll" 
    Dim result 
    Dim Stream 

    Label1.Text = "----- Started -----." 

    UniqueID = CDD1.Item(Index) 
    Label1.Text = Label1.Text & vbCrLf & "ID found: " & UniqueID 

    CDD2.InitializeDiscRecorder(UniqueID) 
    Label1.Text = Label1.Text & vbCrLf & "Recorder selected!" 

    Directory = FSI.Root 
    Label1.Text = Label1.Text & vbCrLf & "Directory is here: " & Directory.ToString 

    CDD3.Recorder = CDD2 
    Label1.Text = Label1.Text & vbCrLf & "Recorder 2 selected!" 

    CDD3.ClientName = "IMAPI2 TEST" 
    Label1.Text = Label1.Text & vbCrLf & "Client Name Selected!" 

    FSI.ChooseImageDefaults(CDD2) 
    Label1.Text = Label1.Text & vbCrLf & "Default selected!" 

    Directory.AddTree(Path, False) 
    Label1.Text = Label1.Text & vbCrLf & "Directory added!" 

    result = FSI.CreateResultImage() 
    Stream = result.ImageStream 

    Label1.Text = Label1.Text & vbCrLf & "Writing content to disc..." 

    If (CDD3.IsCurrentMediaSupported(CDD2) = True) Then 
     If (CDD3.IsRecorderSupported(CDD2) = True) Then 

      CDD3.Write(Stream) 

     Else 
      MsgBox("Not Suported Recorder!") 
     End If 
    Else 
     MsgBox("Not Suported Media!") 
    End If 

    Label1.Text = Label1.Text & vbCrLf & "----- Finished -----" 

End Sub 

Lorsque la commande

CDD3.Write (flux)

est déclenché, le gel du programme, et ne répondent pas tant que les données complètement brûlé.

Est-il possible d'arrêter cela, d'arrêter le gel du programme et d'activer la barre de progression?

Merci.

Répondre

1

Vous devez utiliser le filetage. Ainsi, dans votre gestionnaire d'événements de clic de bouton, vous démarrez un nouveau thread qui effectue la gravure réelle et tandis que cela se passe dans son thread séparé, le thread principal peut continuer à mettre à jour l'interface graphique (y compris votre barre de progression).

Voir Thread.Start pour un simple échantillon et si vous voulez plus d'informations, je vous suggère de commencer ici: Managed Threading

+0

Merci pour votre réponse. Mais maintenant, j'ai un nouveau problème. Lorsque je démarre un nouveau thread, il faut faire tout ce que j'ai fait dans Form1, pour sélectionner le lecteur, le nom, l'enregistreur, etc. car il ne peut pas le reconnaître depuis Form1.CDD3.Write(). Même si je fais tout cela dans Threat, je ne peux toujours pas obtenir de données, car cela nécessite un nouvel enregistrement des données du pilote, mais cela n'est pas autorisé. Pouvez-vous s'il vous plaît écrivez-moi comment faire cela? Juste comment passer des données et des objets du formulaire principal à la classe et retour. Merci. – SharkTheDark

+0

@user: Si vous avez juste besoin d'envoyer des données du thread principal au thread de travail, utilisez la version du constructeur 'Thread' qui prend un' ParameterizedThreadStart', créez simplement une classe pour contenir les données, créez une instance et envoie cette instance en paramètre. Voir ici pour plus d'informations: http://msdn.microsoft.com/en-us/library/1h2f2459.aspx –

+0

Vous pouvez également utiliser cette instance d'objet pour renvoyer des données au thread principal si nécessaire. Faites en sorte qu'il contienne un peu plus de membres pour contenir ces données et faites en sorte que le thread principal en garde une référence. Cependant, si vous utilisez les mêmes données provenant de plusieurs threads, vous devez gérer la synchronisation comme vous pouvez le voir ici: http://msdn.microsoft.com/en-us/library/z8chs7ft.aspx –