Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 |

 

  Вопрос: Потоки и control'ы Добавлено: 10.07.09 14:55  

Автор вопроса:  Starkiller | Web-сайт: google.ru/ | ICQ: 123123 
Уже весь инет облазил не знаю что делать.
Imports System.Text
Imports System.Threading
Public Class Form1
    Dim potoc1 As New Thread(AddressOf con1)
    Public WithEvents i1 As New мой_контролл
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        potoc1.Start()
    End Sub
    Public Sub con1()
        i1.login(тут_параметры)
    End Sub
    [B]Private Sub i1_connected() Handles i1.connected
        MsgBox("connect")
    End Sub[/B]

    Private Sub i1_fl_error(ByVal code As Integer) Handles i1.fl_error
        MsgBox("Error: " & code)
    End Sub
End Class

Как обратится к контролу, который создал главный поток?:

Ответить

  Ответы Всего ответов: 21  

Номер ответа: 1
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #1
Добавлено: 10.07.09 16:06
А что тебе нужно сделать? Из левого потока нельзя обращаться к элементам управления.

Ответить

Номер ответа: 2
Автор ответа:
 Aston



ICQ: 214-179-991 

Вопросов: 42
Ответов: 272
 Профиль | | #2 Добавлено: 10.07.09 18:48
К контролу, который находится в главном потоке обращаются через делегаты. Поищи в интернете делегирование или делегаты в потоках. На прямую к главному потоку нельзя обращаться из другого потока - в таких ситуациях использует делигаты - смысл их в том, что они исполняют то или иное действие в главном потоке тогда, когда это возможно.

Ответить

Номер ответа: 3
Автор ответа:
 Starkiller



ICQ: 123123 

Вопросов: 3
Ответов: 14
 Web-сайт: google.ru/
 Профиль | | #3
Добавлено: 10.07.09 23:18
А примерчик можно?)

Ответить

Номер ответа: 4
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #4 Добавлено: 11.07.09 03:35
Control.Invoke

Ответить

Номер ответа: 5
Автор ответа:
 Aston



ICQ: 214-179-991 

Вопросов: 42
Ответов: 272
 Профиль | | #5 Добавлено: 11.07.09 16:26
Вот примерчик про потоки, я делал когда изучал их. На форму добавь листвьюв и добавь этот код и увидишь его в действии, но разжевать ты его должен сам.
  1. Imports System.Threading
  2. Imports System.IO
  3. Public Class Form1
  4.     Dim bgThread As Thread
  5.     Public Delegate Function AddANode(ByVal aString As String) As TreeNode
  6.     Sub ScanFolder(ByVal folderSpec As String, ByRef currentNode As TreeNode)
  7.         Dim thisFolder As String
  8.         Dim AllFolders() As String
  9.         AllFolders = Directory.GetDirectories(folderSpec)
  10.         System.Array.Sort(AllFolders)
  11.         For Each thisFolder In AllFolders
  12.             Dim ND As New TreeNode
  13.             ND = CType(TreeView1.Invoke(New AddANode(AddressOf currentNode.Nodes.Add), New Object() {Path.GetFileName(thisFolder)}), TreeNode)
  14.             folderSpec = thisFolder
  15.             ScanFolder(folderSpec, ND)
  16.         Next
  17.     End Sub
  18.     Sub prom(ByVal str As String)
  19.         Me.Text = str
  20.         Me.Refresh()
  21.     End Sub
  22.     Public Sub LoadTreeView()
  23.         Dim ND As New TreeNode()
  24.         Dim initFolder As String = "C:\Program Files"
  25.         ND = CType(TreeView1.Invoke(New AddANode(AddressOf TreeView1.Nodes.Add), New Object() {initFolder}), TreeNode)
  26.         ScanFolder(initFolder, ND)
  27.     End Sub
  28.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  29.         bgThread = New Thread(AddressOf Me.LoadTreeView)
  30.         bgThread.Priority = ThreadPriority.BelowNormal
  31.         bgThread.Start()
  32.         Me.Show()
  33.     End Sub
  34. End Class

Ответить

Номер ответа: 6
Автор ответа:
 Aston



ICQ: 214-179-991 

Вопросов: 42
Ответов: 272
 Профиль | | #6 Добавлено: 11.07.09 16:44
Ой триивьюв надо добавит а не листвиев :).

Ответить

Номер ответа: 7
Автор ответа:
 -=Fenix=-



Вопросов: 33
Ответов: 81
 Профиль | | #7 Добавлено: 13.07.09 17:34
Как продолжение темы о потоках....

Хочу обработать ListView элемент в отдельном потоке
[параллельная тема http://bbs.vbstreets.ru/viewtopic.php?f=2&t=40130&p=6726831#p6726831]
  1.  
  2. Public Class Main
  3.     Private Core As Core
  4.  
  5.     Private Sub Main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  6.         Core = New Core
  7.     End Sub
  8.  
  9.     Private Sub btn_Start_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Start.Click
  10.         Core.Thread_Manager()
  11.     End Sub
  12.  
  13.     Public Delegate Sub DlgList(ByVal Index As Integer, ByVal Result As String)
  14.     Public DelegateList As New DlgList(AddressOf List)
  15.  
  16.     Public Sub List(ByVal Index As Integer, ByVal Result As String)
  17.         If Not Result Is Nothing Then
  18.             lv_List.Items(Index).SubItems(2).Text = Result
  19.         Else
  20.             lv_List.Items(Index).SubItems(2).Text = "not found"
  21.         End If
  22.     End Sub
  23.  
  24.     Public Delegate Function DlgGetList()
  25.     Public DelegateGetList As New DlgGetList(AddressOf GetList)
  26.  
  27.     Public Function GetList()
  28.         Dim ListViewItemCollection(lv_List.Items.Count - 1) As ListViewItem
  29.  
  30.         lv_List.Items.CopyTo(ListViewItemCollection, 0)
  31.  
  32.         Return ListViewItemCollection
  33.     End Function
  34. End Class


  1.  
  2. Class Core
  3.     Public Form As Main = Main
  4.     Public Options As New Main_Class.Options
  5.  
  6.     Public Sub Thread_Manager()
  7.         ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf Process_Work), Nothing)
  8.     End Sub
  9.  
  10.     Private Sub Process_Work()
  11.         Dim ListViewItemCollection() As ListViewItem = Nothing
  12.  
  13.         Thread.CurrentThread.IsBackground = True
  14.         ListViewItemCollection = Form.Invoke(Form.DelegateGetList, Nothing)
  15.  
  16.         For i = 0 To ListViewItemCollection.Count - 1
  17.             ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf Thread_Work), ListViewItemCollection(i))
  18.         Next
  19.     End Sub
  20.  
  21.     Private Sub Thread_Work(ByVal ListViewItem As ListViewItem)
  22.         Dim Result As String = Nothing
  23.  
  24.         For j = 0 To UBound(Work_Module.Work_Type)
  25.             If Work_Module.Work_Type(j).Name = ListViewItem.Group.Name Then
  26.  
  27.                 Result = Work_Module.Request(ListViewItem.SubItems(0).Text, Work_Module.Work_Type(j).Site(0))
  28.  
  29.                 Form.Invoke(Form.DelegateList, New Object() {ListViewItem.Index, Result})
  30.  
  31.                 Exit For
  32.             End If
  33.         Next
  34.     End Sub
  35. End Class


И в ходе работы на втором инвоке вылетатет - "Cross-thread operation not valid: Control 'lv_List' accessed from a thread other than the thread it was created on."
Как сделать, чтобы работало?

Ответить

Номер ответа: 8
Автор ответа:
 Aston



ICQ: 214-179-991 

Вопросов: 42
Ответов: 272
 Профиль | | #8 Добавлено: 13.07.09 23:03
Ну если честно то в коде влом разбираться, но история всё та же, обращаешься к главному потоку неправельно - а вот это неправильно ты должен сам найти.
В потоках как говорится камней подводных немеренно.

Ответить

Номер ответа: 9
Автор ответа:
 -=Fenix=-



Вопросов: 33
Ответов: 81
 Профиль | | #9 Добавлено: 14.07.09 00:02
Неправильно? Вроде как положено через инвок и делегаты.....
На прикол в том, что начинал с 1 ивока - всё работало, а вот сделал 2мя чё-то вот неполучается

Ответить

Номер ответа: 10
Автор ответа:
 катя



Вопросов: 0
Ответов: 32
 Профиль | | #10 Добавлено: 14.07.09 10:12
  1. MsgBox (Now)

Ответить

Номер ответа: 11
Автор ответа:
 -=Fenix=-



Вопросов: 33
Ответов: 81
 Профиль | | #11 Добавлено: 15.07.09 00:00
Есть идея в проблеме синхронизации, но куда её применять?
пробывал SyncLock на ListView, ничего не вышло

Ответить

Номер ответа: 12
Автор ответа:
 Aston



ICQ: 214-179-991 

Вопросов: 42
Ответов: 272
 Профиль | | #12 Добавлено: 15.07.09 11:22
Феникс смотри внимательно где возникает ошибка, ты обращаешься к главному потоку не через делегат или через делегат но как то не правильно.

Ответить

Номер ответа: 13
Автор ответа:
 vitalis



Вопросов: 1
Ответов: 15
 Web-сайт: domivka.net
 Профиль | | #13
Добавлено: 15.07.09 12:35
Объекты создавать нужно в другом потоке, иначе уничтожаются при завершении. В результате - объекты, которые IsNot Nothing и которых нет фактически

Ответить

Номер ответа: 14
Автор ответа:
 -=Fenix=-



Вопросов: 33
Ответов: 81
 Профиль | | #14 Добавлено: 16.07.09 00:01
Объекты создавать нужно в другом потоке, иначе уничтожаются при завершении. В результате - объекты, которые IsNot Nothing и которых нет фактически

У меня проблема не с объектами, а с доступом к контролу в главном потоке
Феникс смотри внимательно где возникает ошибка, ты обращаешься к главному потоку не через делегат или через делегат но как то не правильно.

Ну с 1м инвоком то работает, значит нормально обращаюсь =)

Ответить

Номер ответа: 15
Автор ответа:
 Aston



ICQ: 214-179-991 

Вопросов: 42
Ответов: 272
 Профиль | | #15 Добавлено: 16.07.09 00:17
А второй не работает - значит что всё равно правильно обращаешся?

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам