Есть проблема. Импортирую в проект апишные функции для того чтобы мне создать отдельный поток. Так вот после того как я пытаюсь вызвать функцию CreateThread у меня выскакивает критическая ошибка о том что "инструкция по адресу....." ну вотбщем как обычно.
Делаю я это вот так
Public Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
Public Declare Function CreateThread Lib "kernel32" (lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal dwStackSize As Long, lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Function ThreadFunc(lParam As Long)
тут что то делается предположим
End Function
Public hEvent, hThread As Long
Sub Main()
Dim ID As Long
Dim ATTR As SECURITY_ATTRIBUTES
Dim ATTR_ As SECURITY_ATTRIBUTES
hEvent = CreateEvent(ATTR, False, False, "mto")
hThread = CreateThread(ATTR_ , 0, AddressOf ThreadFunc, vbNull, 0, 0&)
Set fMainForm = New frmMain
Load fMainForm
fMainForm.Show
End Sub
Причем функция CreateEvent отрабатывает нормально ...
Usus est optimus magister (Опыт — наилучший учитель)
Здравствуйте, Phanat, Вы писали:
P>Есть проблема. Импортирую в проект апишные функции для того чтобы мне создать отдельный поток. Так вот после того как я пытаюсь вызвать функцию CreateThread у меня выскакивает критическая ошибка о том что "инструкция по адресу....." ну вотбщем как обычно. P>Делаю я это вот так
P>
P>Public Type SECURITY_ATTRIBUTES
P> nLength As Long
P> lpSecurityDescriptor As Long
P> bInheritHandle As Long
P>End Type
P>
Извиняюсь, что влезаю в тему в которой мало смыслю (VB), но предположить можно, что в структуре SECURITY_ATTRIBUTES не указана длина nLength структуры, точнее там скорее всего мусор лежит. Отсюда и Access Violation. Попробуй передать вместо ATTR_ тот же vbNull и посмотри на поведение.
P>Причем функция CreateEvent отрабатывает нормально ...
Но с другой стороны непонятно почему отрабатывает создание event'а.
Здравствуйте, Andir, Вы писали:
A>Здравствуйте, Phanat, Вы писали:
P>>Есть проблема. Импортирую в проект апишные функции для того чтобы мне создать отдельный поток. Так вот после того как я пытаюсь вызвать функцию CreateThread у меня выскакивает критическая ошибка о том что "инструкция по адресу....." ну вотбщем как обычно. P>>Делаю я это вот так
P>>
P>>Public Type SECURITY_ATTRIBUTES
P>> nLength As Long
P>> lpSecurityDescriptor As Long
P>> bInheritHandle As Long
P>>End Type
P>>
A>Извиняюсь, что влезаю в тему в которой мало смыслю (VB), но предположить можно, что в структуре SECURITY_ATTRIBUTES не указана длина nLength структуры, точнее там скорее всего мусор лежит. Отсюда и Access Violation. Попробуй передать вместо ATTR_ тот же vbNull и посмотри на поведение.
Пробовал передавать и vbNull, к сожалению тоже не помогает
P>>Причем функция CreateEvent отрабатывает нормально ... A>Но с другой стороны непонятно почему отрабатывает создание event'а.
Вот и я не могу понять. Даже и не знаю что делать.
A>C Уважением, Andir!
Usus est optimus magister (Опыт — наилучший учитель)
Public Declare Function CreateThread Lib"kernel32" (lpThreadAttributes As Long, ByVal dwStackSize As Long, lpStartAddress As Long, lpParameter As Long, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long
Public Declare Function CloseHandle Lib"kernel32" (ByVal hObject As Long) As Long
Public Function ThreadFunc(lParam As Long) as Long
тут что то делается предположим
End Function
Public hEvent, hThread As Long, ID As LongSub Main()
hEvent = CreateEvent(0, False, False, "mto")
hThread = CreateThread(0 , 0, AddressOf ThreadFunc, 0, 0, ID)
A>Извиняюсь, что влезаю в тему в которой мало смыслю (VB), но предположить можно, что в структуре SECURITY_ATTRIBUTES не указана длина nLength структуры, точнее там скорее всего мусор лежит. Отсюда и Access Violation.
В VB не бывает "мусора" в понятиях С++. Там находится чистый 0. Ориентируются ли на это значение указанные функции, я не знаю.
A>Попробуй передать вместо ATTR_ тот же vbNull и посмотри на поведение.
Только не vbNull, а vbNullString (VB-шный эквивалент С++ NULL). Или сделать ATTR.nLength = Len(ATTR)
Здравствуйте, Vi2, Вы писали:
Vi2>В VB не бывает "мусора" в понятиях С++. Там находится чистый 0. Ориентируются ли на это значение указанные функции, я не знаю.
Ну что поделаешь с этим VB ... Ну не знал, не знал ... спасибо что просветил. Я в принципе и имел ввиду, что там явно не то самое значение, которое равно длине структуры. Просто вроде как AV больше там и негде вылезти.
Vi2>Только не vbNull, а vbNullString (VB-шный эквивалент С++ NULL). Или сделать ATTR.nLength = Len(ATTR).
по аналогии сказал, не знал, что в VB ещё и нулы разные есть ...
Здравствуйте, SCS, Вы писали:
SCS> hThread = CreateThread(0 , 0, AddressOf ThreadFunc, 0, 0, ID)
Интересно, а что автор верхнего поста собирается передать в качестве ThreadFunc ? Если VB-шную процедуру или функцию — то по-моему все замечательно отвалится. Где-то в MSDN была статья про "Hardcore VB" и создание потоков — там вроде были еще какие-то подводные камни с потоками в VB. То есть в принципе можно, но не просто
Здравствуйте, Ivan, Вы писали: I> То есть в принципе можно, но не просто
Если я правильно помню, при создании потока в VB не получится пользоваться отладчиком — он будет все время валиться — то есть код нормально ты отладить не сможешь, а в функциях, которые работают в других потоках есть куча ограничений на то, чем можно пользоваться — ведь VB runtime в них непроинициализирован и COM тоже. Мораль в том, что VB (не считая VB.NET) не поддерживает многопоточность (кроме COM-объектов ,обработчиков событий и VB-шных exe-серверов, в которых пул потоков создается), поэтому советую вместо CreateThread написать COM-объект, в котором и делать все что надо или COM-объект будет создавать поток, а после этого вызывать обратно VB на этом потоке.
Здравствуйте, Ivan, Вы писали:
I>Здравствуйте, Ivan, Вы писали: I>> То есть в принципе можно, но не просто I>Если я правильно помню, при создании потока в VB не получится пользоваться отладчиком — он будет все время валиться — то есть код нормально ты отладить не сможешь, а в функциях, которые работают в других потоках есть куча ограничений на то, чем можно пользоваться — ведь VB runtime в них непроинициализирован и COM тоже. Мораль в том, что VB (не считая VB.NET) не поддерживает многопоточность (кроме COM-объектов ,обработчиков событий и VB-шных exe-серверов, в которых пул потоков создается), поэтому советую вместо CreateThread написать COM-объект, в котором и делать все что надо или COM-объект будет создавать поток, а после этого вызывать обратно VB на этом потоке.
Не надо так строго. Ведь CoInitialize можно то же ручками вызвать. А вот передавать указатель на интерфейс (читай обьект) просто так не удасться, но опять же можно воспользоваться маршалингом явно. Хотя конечно для VB многопоточность это изврат.
Здравствуйте, Tom, Вы писали:
Tom>Здравствуйте, Ivan, Вы писали:
Tom>Не надо так строго. Ведь CoInitialize можно то же ручками вызвать.
Даже если вызывать CoInitialize, вряд ли удастся чего-то хорошего добиться — отладчик от этого валиться не перестанет, да и как VB runtime инициализировать — мне неизвестно. Хотя науке известны способы создания потоков в VB (hardcore VB ), я бы этим заниматься не стал.