process.exited nefunguje   otázka

VB.NET

AddHandler myProcess.Exited, AddressOf Me.ProcessExited

Private Sub VyberAkce()
 Dim myProcess As New Process
       Try
          myProcess.StartInfo.UseShellExecute = False                    
          myProcess.EnableRaisingEvents = True
          myProcess.StartInfo.RedirectStandardOutput = True          
          AddHandler myProcess.Exited, AddressOf Me.ProcessExited 
          myProcess.StartInfo.WorkingDirectory = m_Adresar
                    myProcess.StartInfo.FileName = m_Aplikace
                    myProcess.StartInfo.Arguments = m_Argument                  
                    myProcess.Start()
                    m_CurrentID = myProcess.Id              
                    PridejTask(m_CurrentID)
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
End Sub

 Public Sub PridejTask(ByVal IDtask As Int32)
        Dim item As ListViewItem = frmTASK.lvTASK.Items.Add(m_PocetUkolu)
        item.SubItems.Add("nejaky text")
        item.SubItems.Add(NejakeDatum)
        item.SubItems.Add(NejakyInterval)
        item.SubItems.Add(NejakaHodnota)
        item.SubItems.Add(IDtask)
        m_PocetUkolu += 1
''''Vse FUNGUJE jak ma...'''
    End Sub

  Friend Sub ProcessExited(ByVal sender As Object, ByVal e As System.EventArgs)
        Using myProcess As Process = DirectCast(sender, Process)
            Dim pocet As Integer           
            m_CurrentID = myProcess.Id           
            pocet = frmTASK.lvTASK.Items.Count
            MessageBox.Show(m_CurrentID) 'FUNGUJE
          

            MessageBox.Show(pocet) 'NEFUNGUJE
            ''''VYSLEDEK POCET=0''' pritom je jasne v listview formulare x polozek..

'kdyz doplnim pro overeni prikaz frmTASK.show, tak otevre NOVE okno - s prazdnym Listview
        End Using
End Sub

Prosim, pomozte mi najit chybu - nemuzu se hnout dal.
Nechapu, proc si otvira novou instanci frmTASK...
   
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zapomnel jsem se prihlasit, pardon.

V podstate jde o trivialni zalezitost a urcite trivialni chybu, znate to - muzete cumet hodiny a netrkne vas to.

Dik za kazdou snahu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Událost Process.Exited je vyvolána v jiném vlákně. Řešením je tedy volat kód vaší metody ProcessExited ve hlavním vlákně pomocí Invoke(). Tato problematika je popsána v článku:

http://vbnet.cz/clanek--27-kreslici_tabu...

frmTASK není instance třídy ale pouze třída. Příkazem frmTask.Show() tedy přistupujete k "default instance", která je pravděpodobně pro každé vlákno jiná. Z jiného vlákna se tedy otevírá jiné/nové okno.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1. Diky moc za reakci.

2.

Bohuzel nejsem doma, takze pouze v hlave:

Jestli to dobre chapu, tak mam vyhodit definici na zacatku formulare:

AddHandler myProcess.Exited, AddressOf Me.ProcessExited

V poradku. Ale kam bych mel podle vas zaradit:

 If Me.InvokeRequired Then 
             Me.Invoke(New MethodInvoker(AddressOf ProcessExited)) 
         Else
....
end if

?

Cilem kratke ukazky meho kodu bylo spusteni nekolika procesu, zapsani udaju o nich do ListView.

Nasledne pak po ukonceni kazdeho procesu udelat zapis/zmenu v souvisejici polozce/radku.

To se melo dit prave v ProcessExited, resp. tam se mel umistit odkaz na proceduru, ktera zajisti overeni, zda ID konkretniho procesu je rovne v SubItem, do ktere jsem predtim ulozil IDtask.

Paradoxne jsem to mel zpracovane kdysi ve VB6, tady jsem narazil.

3.

Te casti s "default instance" formulare prilis nerozumim. To frmTASK.show jsem zaradil jen jako kontrolu, jestli neni problem v tom, ktery formular zpracovam, kdyz se mi nabizeli nulove pocty radku v Listview.

Doufam, ze to zminenym postupem s Invoke odpada...

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback