Проблема с API функцией CreateThread
От: Phanat  
Дата: 17.01.03 05:46
Оценка:
Есть проблема. Импортирую в проект апишные функции для того чтобы мне создать отдельный поток. Так вот после того как я пытаюсь вызвать функцию 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 (Опыт — наилучший учитель)
Re: Проблема с API функцией CreateThread
От: Andir Россия
Дата: 17.01.03 05:59
Оценка:
Здравствуйте, 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'а.

C Уважением, Andir!
Re[2]: Проблема с API функцией CreateThread
От: Phanat  
Дата: 17.01.03 06:08
Оценка:
Здравствуйте, 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 (Опыт — наилучший учитель)
Re: Проблема с API функцией CreateThread
От: SCS  
Дата: 17.01.03 06:21
Оценка: 9 (1)
Здравствуйте, Phanat, Вы писали:

попробуй так
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 Long

Sub Main()

    hEvent = CreateEvent(0, False, False, "mto")
    hThread = CreateThread(0 , 0, AddressOf ThreadFunc, 0, 0, ID)
SCS
Re[2]: vbNullString и длина структуры
От: Vi2 Удмуртия http://www.adem.ru
Дата: 17.01.03 07:06
Оценка: 10 (1)
Здравствуйте, Andir, Вы писали:

A>Извиняюсь, что влезаю в тему в которой мало смыслю (VB), но предположить можно, что в структуре SECURITY_ATTRIBUTES не указана длина nLength структуры, точнее там скорее всего мусор лежит. Отсюда и Access Violation.

В VB не бывает "мусора" в понятиях С++. Там находится чистый 0. Ориентируются ли на это значение указанные функции, я не знаю.

A>Попробуй передать вместо ATTR_ тот же vbNull и посмотри на поведение.

Только не vbNull, а vbNullString (VB-шный эквивалент С++ NULL). Или сделать ATTR.nLength = Len(ATTR)
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[3]: vbNullString и длина структуры
От: Andir Россия
Дата: 17.01.03 07:12
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>В VB не бывает "мусора" в понятиях С++. Там находится чистый 0. Ориентируются ли на это значение указанные функции, я не знаю.

Ну что поделаешь с этим VB ... Ну не знал, не знал ... спасибо что просветил. Я в принципе и имел ввиду, что там явно не то самое значение, которое равно длине структуры. Просто вроде как AV больше там и негде вылезти.

Vi2>Только не vbNull, а vbNullString (VB-шный эквивалент С++ NULL). Или сделать ATTR.nLength = Len(ATTR).

по аналогии сказал, не знал, что в VB ещё и нулы разные есть ...

С Уважением, Andir!
Re[2]: Проблема с API функцией CreateThread
От: Ivan Россия www.rsdn.ru
Дата: 18.01.03 14:37
Оценка:
Здравствуйте, SCS, Вы писали:

SCS> hThread = CreateThread(0 , 0, AddressOf ThreadFunc, 0, 0, ID)

Интересно, а что автор верхнего поста собирается передать в качестве ThreadFunc ? Если VB-шную процедуру или функцию — то по-моему все замечательно отвалится. Где-то в MSDN была статья про "Hardcore VB" и создание потоков — там вроде были еще какие-то подводные камни с потоками в VB. То есть в принципе можно, но не просто
Re[3]: Проблема с API функцией CreateThread
От: Ivan Россия www.rsdn.ru
Дата: 18.01.03 14:58
Оценка:
Здравствуйте, Ivan, Вы писали:
I> То есть в принципе можно, но не просто
Если я правильно помню, при создании потока в VB не получится пользоваться отладчиком — он будет все время валиться — то есть код нормально ты отладить не сможешь, а в функциях, которые работают в других потоках есть куча ограничений на то, чем можно пользоваться — ведь VB runtime в них непроинициализирован и COM тоже. Мораль в том, что VB (не считая VB.NET) не поддерживает многопоточность (кроме COM-объектов ,обработчиков событий и VB-шных exe-серверов, в которых пул потоков создается), поэтому советую вместо CreateThread написать COM-объект, в котором и делать все что надо или COM-объект будет создавать поток, а после этого вызывать обратно VB на этом потоке.
Re[4]: Проблема с API функцией CreateThread
От: Tom Россия http://www.RSDN.ru
Дата: 27.01.03 19:53
Оценка:
Здравствуйте, Ivan, Вы писали:

I>Здравствуйте, Ivan, Вы писали:

I>> То есть в принципе можно, но не просто
I>Если я правильно помню, при создании потока в VB не получится пользоваться отладчиком — он будет все время валиться — то есть код нормально ты отладить не сможешь, а в функциях, которые работают в других потоках есть куча ограничений на то, чем можно пользоваться — ведь VB runtime в них непроинициализирован и COM тоже. Мораль в том, что VB (не считая VB.NET) не поддерживает многопоточность (кроме COM-объектов ,обработчиков событий и VB-шных exe-серверов, в которых пул потоков создается), поэтому советую вместо CreateThread написать COM-объект, в котором и делать все что надо или COM-объект будет создавать поток, а после этого вызывать обратно VB на этом потоке.

Не надо так строго. Ведь CoInitialize можно то же ручками вызвать. А вот передавать указатель на интерфейс (читай обьект) просто так не удасться, но опять же можно воспользоваться маршалингом явно. Хотя конечно для VB многопоточность это изврат.
Народная мудрось
всем все никому ничего(с).
Re[5]: Проблема с API функцией CreateThread
От: Ivan Россия www.rsdn.ru
Дата: 28.01.03 06:47
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>Здравствуйте, Ivan, Вы писали:


Tom>Не надо так строго. Ведь CoInitialize можно то же ручками вызвать.

Даже если вызывать CoInitialize, вряд ли удастся чего-то хорошего добиться — отладчик от этого валиться не перестанет, да и как VB runtime инициализировать — мне неизвестно. Хотя науке известны способы создания потоков в VB (hardcore VB ), я бы этим заниматься не стал.
Re[3]: Проблема с API функцией CreateThread
От: BugMan  
Дата: 28.01.03 22:12
Оценка:
Попробуй передавать
  CreateThead(ByVal 0&.....

Только импортировать её надо будет с параметром как Long или Any
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.