Вопрос о многопоточности

#mysql #vb.net #multithreading

#mysql #vb.net #многопоточность

Вопрос:

Я пытаюсь создать серверную программу для игры, мне нужно запустить 3 дополнительных потока в приложении Windows form. все потоки должны иметь доступ к одним и тем же переменным (thread1: собирается извлекать пользовательские команды из моей базы данных и выполнять их, thread2: собирается обновлять все пользовательские данные, а thread3: собирается отправлять все новые переменные обратно в базу данных.) Я просмотрел фоновые потоки, и я не уверен, будет ли это делать то, что я от них хочу (они выглядят так, как будто могли бы запускать мой код, но, похоже, им было бы трудно работать с одними и теми же переменными для всех потоков.)

Итак, я предполагаю, что мой вопрос заключается в том, возможно ли это и каков наилучший способ добиться этого, справятся ли фоновые рабочие и invoke с задачей? с какими проблемами я бы столкнулся при этом, у кого-нибудь есть идея получше.

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

 dim newthread as new system.threading.thread(addressof runmycode)   
newthread.start()`
  

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

Ответ №1:

Вам нужно создать «новый» экземпляр класса object для «многопоточности» и предоставить функцию, которую вы хотите вызвать, например

 Public Class MyNewCode
    Public Function runmycode()

        ' My code goes here '

    End Function
End Class


Public Class frmMain ' or under an onClick event or whatever.... '
    Dim s As New MyNewCode ' This is the class above '
    t = New System.Threading.Thread(AddressOf s.runmycode) ' This is the function above '
    t.start()
End Class
  

Комментарии:

1. при условии, что это освобождает мой пользовательский интерфейс, я думаю, это именно то, что я ищу.

Ответ №2:

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

Создание простой многопоточной виртуальной машины.Сетевое приложение