Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kako se moze dodati progress bar prilikom rezanja CD/DVD-a?

[es] :: .NET :: Kako se moze dodati progress bar prilikom rezanja CD/DVD-a?

[ Pregleda: 2337 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Lord_Nenad
Lord_Nenad
Zvornik

Član broj: 143541
Poruke: 170
188.124.200.*



+8 Profil

icon Kako se moze dodati progress bar prilikom rezanja CD/DVD-a?24.09.2010. u 21:27 - pre 164 meseci
Pozdrav svima,


Poceo sam da pravim program pomocu kog ce se moci narezivati CD/DVD, program radim pomocu VB 2008.
Radi se pomocu IMAPI2.dll i IMAPI2FS.dll

Evo koda:

Code:

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




U ovom slucaju je pogram blokirao sve dok ne zavrsi narezivanje.
I onda sam dodao novi element: BackgroundWorker

I ubacio CDD3.Write(Stream) u DoWork tog elementa, tako da sad program ne blokira, ali jos uvek ne mogu da pristupim procesu narezivanja.

U ovom slucaju ne blokira program, nego zablokira taj BackgroundWorker, pa tako reze.

Kad pokusam da pristupim disku, pomocu CDD3.TotalSectorsOnMedia, izbaci mi gresku.

Jel zna neko neki drugi nacin da se ovo uradi?

Da li je pouzdano na osnovu velicine fajlova koji se narezuju i pomocu prethodno definisane brzine narezivanja odrediti procenat narezanog dela?


Hvala.

 
Odgovor na temu

Mikelly

Član broj: 16730
Poruke: 389
213.149.104.*



Profil

icon Re: Kako se moze dodati progress bar prilikom rezanja CD/DVD-a?08.10.2010. u 21:59 - pre 163 meseci
Koristis event koji je definisan u IMAPI2 interopu:

Code:

    public interface DDiscFormat2DataEvents
    {        
        [DispId(0x200)]
        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
        void Update([In, MarshalAs(UnmanagedType.IDispatch)] object sender, [In, MarshalAs(UnmanagedType.IDispatch)] object progress);
    }
    
    [ComEventInterface(typeof(DDiscFormat2DataEvents),typeof(DiscFormat2Data_EventProvider))]
    [TypeLibType(TypeLibTypeFlags.FHidden)]
    public interface DiscFormat2Data_Event
    {        
        event DiscFormat2Data_EventHandler Update;
    }


onda se prijavis na Update event MsftDiscFormat2Data klase funcijom kao npr (copy paste iz mog koda):

Code:

void discFormatData_Update([In, MarshalAs(UnmanagedType.IDispatch)] object sender, [In, MarshalAs(UnmanagedType.IDispatch)] object progress)
        {
            var eventArgs = (IDiscFormat2DataEventArgs)progress;

            BurnData _burnData = new BurnData();

            _burnData.task = BURN_MEDIA_TASK.BURN_MEDIA_TASK_WRITING;
            
            _burnData.elapsedTime = eventArgs.ElapsedTime;
            _burnData.remainingTime = eventArgs.RemainingTime;
            _burnData.totalTime = eventArgs.TotalTime;

            _burnData.currentAction = eventArgs.CurrentAction;
            _burnData.startLba = eventArgs.StartLba;
            _burnData.sectorCount = eventArgs.SectorCount;
            _burnData.lastReadLba = eventArgs.LastReadLba;
            _burnData.lastWrittenLba = eventArgs.LastWrittenLba;
            _burnData.totalSystemBuffer = eventArgs.TotalSystemBuffer;
            _burnData.usedSystemBuffer = eventArgs.UsedSystemBuffer;
            _burnData.freeSystemBuffer = eventArgs.FreeSystemBuffer;

            this.Invoke(new MethodInvoker(delegate()
                {                    
                    if (_burnData.task == BURN_MEDIA_TASK.BURN_MEDIA_TASK_WRITING)
                    {
                        switch (burnData.currentAction)
                        {
                            case IMAPI_FORMAT2_DATA_WRITE_ACTION.IMAPI_FORMAT2_DATA_WRITE_ACTION_VALIDATING_MEDIA:
                                labelStatusText.Text = "Testiranje trenutnog diska...";
                                break;

                            case IMAPI_FORMAT2_DATA_WRITE_ACTION.IMAPI_FORMAT2_DATA_WRITE_ACTION_FORMATTING_MEDIA:
                                labelStatusText.Text = "Formatiranje medijuma...";
                                break;

                            case IMAPI_FORMAT2_DATA_WRITE_ACTION.IMAPI_FORMAT2_DATA_WRITE_ACTION_INITIALIZING_HARDWARE:
                                labelStatusText.Text = "Inicijalizacija diska...";
                                break;

                            case IMAPI_FORMAT2_DATA_WRITE_ACTION.IMAPI_FORMAT2_DATA_WRITE_ACTION_CALIBRATING_POWER:
                                labelStatusText.Text = "Optimiziranje intenziteta lasera...";
                                break;

                            case IMAPI_FORMAT2_DATA_WRITE_ACTION.IMAPI_FORMAT2_DATA_WRITE_ACTION_WRITING_DATA:
                                long writtenSectors = _burnData.lastWrittenLba - _burnData.startLba;

                                if (writtenSectors > 0 && _burnData.sectorCount > 0)
                                {
                                    var percent = (int)((100 * writtenSectors) / _burnData.sectorCount);
                                    labelStatusText.Text = string.Format("Progres: {0}%", percent);
                                    prgBurn.Value = percent;
                                }
                                else
                                {
                                    labelStatusText.Text = "Progres 0%";
                                    prgBurn.Value = 0;
                                }
                                break;

                            case IMAPI_FORMAT2_DATA_WRITE_ACTION.IMAPI_FORMAT2_DATA_WRITE_ACTION_FINALIZATION:
                                labelStatusText.Text = "Finaliziranje...";
                                break;

                            case IMAPI_FORMAT2_DATA_WRITE_ACTION.IMAPI_FORMAT2_DATA_WRITE_ACTION_COMPLETED:
                                labelStatusText.Text = "Narezivanje je završeno!";
                                prgBurn.Value = 0;
                                break;

                            case IMAPI_FORMAT2_DATA_WRITE_ACTION.IMAPI_FORMAT2_DATA_WRITE_ACTION_VERIFYING:
                                labelStatusText.Text = "Verifikacija...";
                                break;
                        }
                    }
                }
            ));
        }


Napomena, da bi Update event MsftDiscFormat2Data klase uopste opalio, tvoj assembly mora da ima podesen ComVisible artibut na true (u AssemblyInfoo.cs fajlu):
Code:

[assembly: ComVisible(true)]
 
Odgovor na temu

[es] :: .NET :: Kako se moze dodati progress bar prilikom rezanja CD/DVD-a?

[ Pregleda: 2337 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.