2013-11-10 3 views
0

Я искал вокруг, и я хочу прервать поток и перезапустить его, то, что должно быть действительно простым, но никто не отвечает.Как перезапустить нить, ни пауза, ни спать

У меня есть пользователь, который conenct throught form, когда пользователь аутентифицирован, поднимет событие, чтобы связать пользователя с новой формой на другом потоке, поэтому, если пользователь отключит, я завершаю поток и вывожу его на форма соединения, но если он попытаться подключиться снова, как я запустить поток снова

запуска связанной формы

Private Sub sAuthentified(ByVal Sender As Coms, ByVal sTemp As String) Handles mComs.sAuthentified 
    If (Equals(Sender.AES_Decrypt(sTemp), "$%?SuccesS&*(")) Then 
     Dim d1 As New HideForm(AddressOf Hide) 
     Me.Invoke(d1) 

     t1.Start() 
    Else 
     ToolTip1.Show(String.Empty, UsernameField, 103, 10, 1) 
     ToolTip1.Show("Matricule et/ou password ne sont pas valide.", UsernameField, 103, 10, 1000) 
    End If 
End Sub 

Ending подключенных форм

Private Sub Me_Disconnect(ByVal Sender As Coms) Handles mComs.Disconnect 
    mComs = Nothing 

    t1.Abort() 

    connectedForm.Dispose() 

    Dim d As New ShowForm(AddressOf Show) 
    Me.Invoke(d) 
End Sub 

Начато t1

Private Sub newForm() 
    connectedForm = New Connected(mComs, sUser_sPass) 

    connectedForm.ShowDialog() 
    connectedForm.Dispose() 

    mComs.sendMessage(Coms.enumTags.Disconnect) 
End Sub 
+0

Что именно происходит в вашей теме? Вместо Abort(), вы можете «приостановить» его, используя различные методы синхронизации потоков. Одной из возможностей может быть использование ManualResetEvent(). Затем вы можете сделать поток буквально остановленным в нужном месте и только продолжить снова, когда установлен MRE. * Я знаю, что вы сказали в своем названии, что не хотите приостанавливать поток ... но поскольку Джон уже ответил, вы не можете его перезапустить, чтобы вы могли открыть другие возможности. –

+0

Я добавил то, что начал поток. – Mokmeuh

+0

Также были бы мои другие возможности, так как в новой форме у меня есть «новый» вызов, поэтому, если он не запущен с начала, форма не будет правильно инициализирована. – Mokmeuh

ответ

3

Я искал вокруг, и я хочу, чтобы прервать поток и перезапустить его, что-то, кто должен быть очень простым, но не один отвечает.

Вы не можете - это так просто. Как только поток успешно прерван (то есть он действительно завершен и находится в состоянии Aborted, а не только AbortRequested), его нельзя перезапустить.

Похоже, вы должны просто создать новый поток, если в этом случае действительно целесообразно использовать несколько потоков. (Непонятно, почему вы хотите иметь несколько потоков пользовательского интерфейса. Обычно есть один поток пользовательского интерфейса, но, возможно, несколько потоков, отличных от UI. Существуют исключения из этого правила, но у вас должна быть действительно веская причина ...)

Я бы также избежал прерывания потоков - единственная нить, которую вы действительно можете благополучно прервать (а затем продолжить с приложением), является текущей нитью, и даже это обычно просто ярлык, чтобы избежать лучшего дизайна. В противном случае вы не знаете, какой поток, который вы прерываете, действительно делает.

+0

Ну, как я могу делай то, что я хочу сделать, спасибо за чистый и аккуратный ответ, потому что всюду я смотрю, я вижу часть ответа – Mokmeuh

+0

@Mokmeuh: Смотрите мое редактирование. Просто создайте новый поток вместо того, чтобы пытаться перезапустить существующий. Или просто иметь только один поток пользовательского интерфейса, который, вероятно, будет более чистым ... –

+0

Ну, мой поток определен сверху как общая переменная, потому что я хочу закончить его в другом событии ... – Mokmeuh

0

Как сказал джон, нет никакого способа, чтобы перезапустить поток, но для тех, кто нужен способ, чтобы обойти с этим, то есть то, что я, уже использовал

ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf newForm)) 
0

Я хотел бы так, но когда Я начинаю его с deleguate я не знаю, почему класс КМ, который обрабатывать все соединения с сервером киоске я дон, т знаю, почему так с новой нити она не заглохнет

все это выглядит довольно грязно для меня ... не имеют clea n исправить для вас. Как сказал Джон, все это, вероятно, нуждается в перепроектировании.

Это не так, как обычно делаются, но это может помочь в вашей ситуации.

Первая кнопка запускает форму в другом потоке, а вторая закрывает эту форму, заставляя поток отключиться.

Public Class Form1 

    Private T1 As System.Threading.Thread = Nothing 
    Private connectedForm As Connected = Nothing 

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
     If IsNothing(T1) Then 
      T1 = New System.Threading.Thread(AddressOf newForm) 
      T1.Start() 
     End If 
    End Sub 

    Private Sub newForm() 
     connectedForm = New Connected() ' New Connected(mComs, sUser_sPass) 
     Application.Run(connectedForm) 
     connectedForm = Nothing 
     T1 = Nothing 
     ' mComs.sendMessage(Coms.enumTags.Disconnect) 
    End Sub 

    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click 
     If Not IsNothing(connectedForm) AndAlso Not connectedForm.IsDisposed Then 
      connectedForm.BeginInvoke(Sub() 
              connectedForm.Close() 
             End Sub) 

     End If 
    End Sub 

End Class 

Есть и другие проблемы с сообщением между формами, начатыми таким образом ... Будьте осторожны!

+0

I doN, t им нужно общаться между ними, но спасибо, также проверьте мой ответ, он отлично работает – Mokmeuh

Смежные вопросы