Как создать и убить Thread средствами WinAPI
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Как создать и убить Thread средствами WinAPI
Требуется используя CreateThread создать поток, что-бы затем можно было его в любой момент убить с помощью TerminateThread. Проблема в том, что процедура создаваемого потока должна быть объявлена такой-вот конструкцией
DWORD WINAPI ThreadProc(
[in] LPVOID lpParameter
);
И как можно эту конструкцию интерпретировать в Clarion-e. Др. сл. как оформить процедуру в ссответсвиии с требовании Windows CallBack
Заранее всем благодарен.
DWORD WINAPI ThreadProc(
[in] LPVOID lpParameter
);
И как можно эту конструкцию интерпретировать в Clarion-e. Др. сл. как оформить процедуру в ссответсвиии с требовании Windows CallBack
Заранее всем благодарен.
- StillZero
- Ветеран
- Сообщения: 454
- Зарегистрирован: 06 Июль 2005, 2:17
- Откуда: Хабаровск
- Контактная информация:
Re: Как создать и убить Thread средствами WinAPI
примеры
в твоем случае
CreateThread также описать с LONG и передавать ThreadProc как ADDRESS(ThreadProc)
в ThreadProc будет передаваться адрес lpParameter, получать данные из него по memcpy
Код: Выделить всё
MAP
CFC_hook:MessageProc PROCEDURE(LONG inCode,ULONG wParam,LONG lParam),LONG,[b]PASCAL[/b]
WatchFileProc PROCEDURE(LONG),LONG,[b]PASCAL[/b]
END
Код: Выделить всё
MAP
ThreadProc (LONG lpParameter),LONG,PASCAL
END
в ThreadProc будет передаваться адрес lpParameter, получать данные из него по memcpy
Все сайты закрыты...
- StillZero
- Ветеран
- Сообщения: 454
- Зарегистрирован: 06 Июль 2005, 2:17
- Откуда: Хабаровск
- Контактная информация:
Re: Как создать и убить Thread средствами WinAPI
вот нашел какой то стародавний пример с этой хней
- Вложения
-
- classeswatchfile.zip
- (13.42 КБ) 242 скачивания
Все сайты закрыты...
- StillZero
- Ветеран
- Сообщения: 454
- Зарегистрирован: 06 Июль 2005, 2:17
- Откуда: Хабаровск
- Контактная информация:
Re: Как создать и убить Thread средствами WinAPI
Код: Выделить всё
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
Про ThreadProc написано следующее
Код: Выделить всё
DWORD WINAPI ThreadProc(
LPVOID lpParameter
);
Код: Выделить всё
Map
WatchFileProc(long lpParameter),long,pascal
end
Далее эту процедуру надо реализовать.
Из прототипа видно, что надо передавать какой то параметр по адресу. ЭТот параметр передается опять таки через CreateThread (четвертым параметром), т.е.
Код: Выделить всё
CreateThread(0,256,address(WatchFileProc),address(ПАРАМЕТР),1,ThreadID)
Код: Выделить всё
memcpy(address(locWaitStruct),lpWaitStruct,size(WaitStruct))
Все сайты закрыты...
Re: Как создать и убить Thread средствами WinAPI
WatchFileProc - это обычная виндовс бэхейрвором сделатая?
- StillZero
- Ветеран
- Сообщения: 454
- Зарегистрирован: 06 Июль 2005, 2:17
- Откуда: Хабаровск
- Контактная информация:
Re: Как создать и убить Thread средствами WinAPI
Обычная кларина процедура, имя любое может быть, прототип как описано в MSDN, атрибут PASCAL необходим для всех API
Все сайты закрыты...
- WadimZapara
- Активист
- Сообщения: 181
- Зарегистрирован: 11 Июнь 2008, 12:11
- Откуда: Тамбов
Re: Как создать и убить Thread средствами WinAPI
это работает
Остерегаться:
1) если параметр, адрес которого передаётся в процедуру отдельного потока, не STATIC, в связи с постраничной работой с памятью Windows может произойти "Access Violation" ошибка, т.е. переменная может оказаться выгруженной в страничный файл
2) если процедура, где объявлена эта переменная, прекратит свою работу раньше, чем новый поток, а после этого последует в потоке обращение к данной переменной (через её адрес) - будет та же ошибка
- в обоих случаях программа упадёт
Код: Выделить всё
Test PROGRAM
MAP
MODULE('Windows')
CloseHandle(UnSigned Handle), BOOL, Raw,Pascal,DLL(TRUE), Proc
CreateThread(ULong PtrSecurAttr=0, ULong StackSizeInBytes=0, ULong AddrProcThread, ULong PtrToParams=0, |
ULong CreationFlags=0, ULong Ptr_ThreadId=0), UnSigned,Pascal,DLL(TRUE)
TerminateThread(UnSigned hThread, ULong dwExitCode),Signed, RAW,Pascal,DLL(TRUE), Proc
END
MeProc PROCEDURE(ULong MeParam), Pascal !вызов через CreateThread
END
h Unsigned !Handle
tcs CString(1024),Static
CODE
tcs = 'что-то абрабкадабристое'
h = CreateThread(0, 25000, Address(MeProc), Address(tcs))
if Message('Основная программа близка к завершению', 'Убить поток?', ICON:Exclamation, 'ДА|НЕТ') = 1 then
TerminateThread(h, 0)
CloseHandle(h) ! обязательно
else
! ну не знаю - что хочешь тут
CloseHandle(h) ! обязательно
end
Message('Всё')
RETURN
!--------------------------------------------------------
MeProc PROCEDURE(ULong MeParam) !вызов через CreateThread
IN_TCS Group
Addr ULong(0)
Leng ULong(1024)
End
TCS Group,Over(IN_TCS)
ptr &CString
End
Code
! Обрабатываю MeParam, например, то, что по этому адресу
IN_TCS = MeParam ! настраиваю указатель, длина уже задана=1024
! теперь TCS.ptr указывает на строку, адрес которой передан в процедуру
Message(TCS.ptr) ! выводим "что-то абрабкадабристое"
Return
1) если параметр, адрес которого передаётся в процедуру отдельного потока, не STATIC, в связи с постраничной работой с памятью Windows может произойти "Access Violation" ошибка, т.е. переменная может оказаться выгруженной в страничный файл
2) если процедура, где объявлена эта переменная, прекратит свою работу раньше, чем новый поток, а после этого последует в потоке обращение к данной переменной (через её адрес) - будет та же ошибка
- в обоих случаях программа упадёт
Компьютер имеет то преимущество перед мозгом, что им пользуются...