Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Вылетает после CreateThread Добавлено: 04.12.05 09:01  

Автор вопроса:  BUG(O)R | Web-сайт: hunger.ru | ICQ: 827887 
Приветствую всех!
Возникла проблема, программа вылетает после вызова CreateThread, с какими только параметрами я её не вызывал, понять не могу в чём проблема...

Public Sub CmdStart_Click()
    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-сайт: hunger.ru
 Профиль | | #3
Добавлено: 04.12.05 11:06
Public Sub DebugThread()

    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-сайт: hunger.ru
 Профиль | | #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-сайт: hunger.ru
 Профиль | | #7
Добавлено: 04.12.05 14:05
И какое значение должен нести этот параметр, есть разница?

Ответить

Номер ответа: 8
Автор ответа:
 BUG(O)R



ICQ: 827887 

Вопросов: 13
Ответов: 142
 Web-сайт: hunger.ru
 Профиль | | #8
Добавлено: 04.12.05 14:07
Всё понял о чём вы, можете на вопрос не отвечать:)

Ответить

Номер ответа: 9
Автор ответа:
 BUG(O)R



ICQ: 827887 

Вопросов: 13
Ответов: 142
 Web-сайт: hunger.ru
 Профиль | | #9
Добавлено: 04.12.05 14:08
Мужики, падает!!!

Ответить

Номер ответа: 10
Автор ответа:
 BUG(O)R



ICQ: 827887 

Вопросов: 13
Ответов: 142
 Web-сайт: hunger.ru
 Профиль | | #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 миллисекунд одна процедура (основная), а вторая - сколько получится (отображение какого-нибудь мудреного прогрессбара).

Ответить

Страница: 1 |

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



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