b_art |
опубликован 08-03-2002 14:43 MSK
Подскажите пожалуйста в чем проблема ? Мне нужно создать два потока, выполнить в них две простые функции (для примера - пустой цикл) и закрыть их. Для работы я использую известный класс - 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
Мда. Потоки в VB - ненадежная вещь. Во первых не экспериментируй с потоками в среде разработчика, потоки должен создавать твой Апп, а не Visual Studio, сечешь? Ну а во вторых, функция-поток должна быть вечной. Не знаю наверняка зачем так надо, но так надо. Иначя начнется материться будет чисто виртуальная машина msvbvm6.dll Попробуй зациклить свои функции типа : Do Loopможно убить поток из потока в ручную на апи в любом месте потока, мне кажеца: Call TerminateThread(GetCurrentThread, ByVal 0&) тогда и зацикливать ничего не надо, но Апп при выходе наверняка ругнется. лучше убить поток ВНЕ потока : ThreadControl1.TerminateCurrentThread, без ругани, но один чёрт с глюками. Чтобы узнать когда Thread сделал свё дело можно использовать флаг и Timer. Типа поток перед входом в вечный цикл переводит флаг в состояние 0, а таймер на форме через каждые там 3 секунды, к примеру, проверяет значение флага, и если 0, то ThreadControl1.TerminateCurrentThread. Еще для синхронизации можно использовать всякие фишки вроде мутексов и семафоров, но это уже другая история. |