Страница: 1 |
Страница: 1 |
Вопрос: Вылетает после CreateThread
Добавлено: 04.12.05 09:01
Автор вопроса: BUG(O)R | Web-сайт:
Приветствую всех!
Возникла проблема, программа вылетает после вызова CreateThread, с какими только параметрами я её не вызывал, понять не могу в чём проблема...
crTh = CreateThread(sa, 0, AddressOf DebugThread, 0, NORMAL_PRIORITY_CLASS, ThID)
End Sub
Где:
Public sa As SECURITY_ATTRIBUTES
Public ThID As Long
Причём после вызова дело даже до процедуры DebugThread не доходит, вылетает не сама прога, а вся среда разработки и никаких сообщений... ничего даже не говорит мне :)
Все переменные и процедура DebugThread находятся в модуле... хотя не думаю, что проблема в этом.
Заранее спасибо!
Ответы
Всего ответов: 14
Номер ответа: 1
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #1
Добавлено: 04.12.05 09:25
NORMAL_PRIORITY_CLASS к чему тут? Замени на ноль.
А вообще неблагодарное это дело - VB-треды.
Номер ответа: 2
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #2
Добавлено: 04.12.05 10:23
Сигнатуру DebugThread покажи...
Номер ответа: 3
Автор ответа:
BUG(O)R
ICQ: 827887
Вопросов: 13
Ответов: 142
Web-сайт:
Профиль | | #3
Добавлено: 04.12.05 11:06
If CreateProcess(sNull, TxtFile.Text, ByVal 0&, ByVal 0&, False, DEBUG_PROCESS + DEBUG_ONLY_THIS_PROCESS, ByVal 0&, ByVal 0&, si, pi) = 0 Then
MsgBox "Процесс не может быть создан!", vbCritical
Exit Sub
End If
a = 0
point:
Do While True
DoEvents
'ждём отладочного события
Call WaitForDebugEvent(DBEvent, -1)
'Дождались? Обрабатываем его!
Select Case DBEvent.dwDebugEventCode
Case CREATE_THREAD_DEBUG_EVENT
Case CREATE_PROCESS_DEBUG_EVENT
'Процесс создан, но не запущен
Case EXCEPTION_DEBUG_EVENT
'произошло исключение
If a = 0 Then ' если оно произошло первый раз, это аппаратное исключение,
'должны его пропустить с флагом DBG_CONTINUE
Call ContinueDebugEvent(DBEvent.dwProcessId, DBEvent.dwThreadId, DBG_CONTINUE)
GoTo point
a = 1
End If
Case EXIT_PROCESS_DEBUG_EVENT
'хана процессу
Exit Do
Case LOAD_DLL_DEBUG_EVENT
'процесс загрузил длл
Case RIP_EVENT
MsgBox "!"
End Select
'продожаем выполнение процесса
Call ContinueDebugEvent(DBEvent.dwProcessId, DBEvent.dwThreadId, DBG_EXCEPTION_NOT_HANDLED)
Loop
'Call ExitThread(0)
End Sub
Номер ответа: 4
Автор ответа:
BUG(O)R
ICQ: 827887
Вопросов: 13
Ответов: 142
Web-сайт:
Профиль | | #4
Добавлено: 04.12.05 11:07
HOOLIGAN нет, это тут не причём
Номер ответа: 5
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #5
Добавлено: 04.12.05 11:15
А теперь сравни эту сигнатуру с той, которая должна быть.
Процедура треда обязана принимать один параметр типа long.
Номер ответа: 6
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #6
Добавлено: 04.12.05 12:21
DebugThread( ByVal lParam As Long)
Номер ответа: 7
Автор ответа:
BUG(O)R
ICQ: 827887
Вопросов: 13
Ответов: 142
Web-сайт:
Профиль | | #7
Добавлено: 04.12.05 14:05
И какое значение должен нести этот параметр, есть разница?
Номер ответа: 8
Автор ответа:
BUG(O)R
ICQ: 827887
Вопросов: 13
Ответов: 142
Web-сайт:
Профиль | | #8
Добавлено: 04.12.05 14:07
Всё понял о чём вы, можете на вопрос не отвечать
Номер ответа: 9
Автор ответа:
BUG(O)R
ICQ: 827887
Вопросов: 13
Ответов: 142
Web-сайт:
Профиль | | #9
Добавлено: 04.12.05 14:08
Мужики, падает!!!
Номер ответа: 10
Автор ответа:
BUG(O)R
ICQ: 827887
Вопросов: 13
Ответов: 142
Web-сайт:
Профиль | | #10
Добавлено: 04.12.05 14:39
Ёлы-палы... кто-нибудь может дать реально работающий пример? Я уже начал разочаровываться в ВБ
Номер ответа: 11
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #11
Добавлено: 04.12.05 15:15
Есть в сети примеры многопоточных прог на VB, работающие в режиме шаткого равновесия при определенном стечении обстоятельств, но имхо это равновесие настолько шаткое, что делать ставку на него бессмысленно.
Номер ответа: 12
Автор ответа:
Страшный Сон
Вопросов: 46
Ответов: 848
Профиль | | #12
Добавлено: 04.12.05 19:44
По-моему нужно CriticalSection'ы использовать, чтобы не вылетало. Только у меня с ними разобраться не получилось.
Номер ответа: 13
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #13
Добавлено: 05.12.05 10:38
Нееееет!!! Сто двадцать раз писал - нельзя на VB использовать свободные потоки! Такой программе сразу место в корзине. Как бы ты не извращался, не использовал контролы и глобальные переменные - все равно вероятность вылета не ниже 50%. Архитектура VB, почти все его функции и элементы управления не потокобезопасны.
Если нужна многопоточность в VB - ActiveX с моделью разделенных потоков.
И сколько можно об этом писать?
Номер ответа: 14
Автор ответа:
Страшный Сон
Вопросов: 46
Ответов: 848
Профиль | | #14
Добавлено: 05.12.05 11:24
Да можно и сэмулировать многопоточность. Типа 10 миллисекунд одна процедура поработала, 10 миллисекунд другая. Либо 100 миллисекунд одна процедура (основная), а вторая - сколько получится (отображение какого-нибудь мудреного прогрессбара).