WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  Visual Basic
  проблема с Thread

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   проблема с Thread
b_art опубликован 08-03-2002 14:43 MSK   Click Here to See the Profile for b_art   Click Here to Email b_art  
Подскажите пожалуйста в чем проблема ?
Мне нужно создать два потока, выполнить в них две простые
функции (для примера - пустой цикл) и закрыть их.
Для работы я использую известный класс - clsThreading
Потоки создаются. Но после завершения первой функции происходит ошибка :
"Программа VB вызвала ошибку VBA6.DLL. Программа VB будет закрыта"
и программа вылетает.
Как сделать чтобы после завершения функции поток автоматически завершался.
(Вставка ThreadControl1.TerminateCurrentThread в конец функции не помогает)


Кусок кода : (система WinMe, VB6) =========
Public ThreadControl1 As clsThreading
Public ThreadControl2 As clsThreading

Private Sub cmdStart_Click()
Set ThreadControl1 = New clsThreading
Set ThreadControl2 = New clsThreading
ThreadControl1.CreateNewThread AddressOf qqq1, tpNormal, True
ThreadControl1.CreateNewThread AddressOf qqq2, tpNormal, True
End Sub


Public Function qqq1()
For l = 1 To 1 000 000
Next l
End Function

Public Function qqq2()
For l = 1 To 20 000 000
Next l
End Function

Vasya2000 опубликован 11-03-2002 07:53 MSK     Click Here to See the Profile for Vasya2000  Click Here to Email Vasya2000     
Мда. Потоки в VB - ненадежная вещь.
Во первых не экспериментируй с потоками в среде разработчика,
потоки должен создавать твой Апп, а не Visual Studio, сечешь?
Ну а во вторых, функция-поток должна быть вечной.
Не знаю наверняка зачем так надо, но так надо. Иначя начнется материться будет чисто виртуальная машина msvbvm6.dll
Попробуй зациклить свои функции типа :
Do
Loop

можно убить поток из потока в ручную на апи в любом месте потока, мне кажеца:
Call TerminateThread(GetCurrentThread, ByVal 0&)
тогда и зацикливать ничего не надо, но Апп при выходе наверняка ругнется.

лучше убить поток ВНЕ потока :
ThreadControl1.TerminateCurrentThread, без ругани, но один чёрт с глюками.
Чтобы узнать когда Thread сделал свё дело можно использовать флаг и Timer.
Типа поток перед входом в вечный цикл переводит флаг в состояние 0, а таймер
на форме через каждые там 3 секунды, к примеру, проверяет значение флага,
и если 0, то ThreadControl1.TerminateCurrentThread. Еще для синхронизации
можно использовать всякие фишки вроде мутексов и семафоров, но это уже другая история.

b_art опубликован 11-03-2002 20:27 MSK     Click Here to See the Profile for b_art  Click Here to Email b_art     
Спасибо за совет.
Решение с флагами у меня есть (Ждать пока все функции завершат работу и потом закрывать все потоки одновременно) - такое решение кажется мне далеко не идеальным, но пока никто ничего другого не предложил.


Public Function qqq1()
Do
If fFlag(1) = True Then
For l = 1 To 1000000
Next l
fFlag(1) = False
End If
Loop
End Function

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.