Как создать и убить Thread средствами WinAPI

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
han
Новичок
Сообщения: 6
Зарегистрирован: 27 Октябрь 2008, 11:52

Как создать и убить Thread средствами WinAPI

Сообщение han »

Требуется используя CreateThread создать поток, что-бы затем можно было его в любой момент убить с помощью TerminateThread. Проблема в том, что процедура создаваемого потока должна быть объявлена такой-вот конструкцией
DWORD WINAPI ThreadProc(
[in] LPVOID lpParameter
);

И как можно эту конструкцию интерпретировать в Clarion-e. Др. сл. как оформить процедуру в ссответсвиии с требовании Windows CallBack
Заранее всем благодарен.
Аватара пользователя
StillZero
Ветеран
Сообщения: 454
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Контактная информация:

Re: Как создать и убить Thread средствами WinAPI

Сообщение StillZero »

примеры

Код: Выделить всё

   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
CreateThread также описать с LONG и передавать ThreadProc как ADDRESS(ThreadProc)
в ThreadProc будет передаваться адрес lpParameter, получать данные из него по memcpy
Все сайты закрыты...
Аватара пользователя
StillZero
Ветеран
Сообщения: 454
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Контактная информация:

Re: Как создать и убить Thread средствами WinAPI

Сообщение StillZero »

вот нашел какой то стародавний пример с этой хней
Вложения
classeswatchfile.zip
(13.42 КБ) 242 скачивания
Все сайты закрыты...
Аватара пользователя
StillZero
Ветеран
Сообщения: 454
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Контактная информация:

Re: Как создать и убить Thread средствами WinAPI

Сообщение StillZero »

Код: Выделить всё

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  SIZE_T dwStackSize,
  LPTHREAD_START_ROUTINE lpStartAddress,
  LPVOID lpParameter,
  DWORD dwCreationFlags,
  LPDWORD lpThreadId
);
здесь интересует lpStartAddress, где говорится, что это ThreadProc, то бишь процедура потока
Про ThreadProc написано следующее

Код: Выделить всё

DWORD WINAPI ThreadProc(
  LPVOID lpParameter
);
в кларе описываем так

Код: Выделить всё

 Map
   WatchFileProc(long lpParameter),long,pascal
 end
Здесь интересен только момент PASCAL

Далее эту процедуру надо реализовать.
Из прототипа видно, что надо передавать какой то параметр по адресу. ЭТот параметр передается опять таки через CreateThread (четвертым параметром), т.е.

Код: Выделить всё

CreateThread(0,256,address(WatchFileProc),address(ПАРАМЕТР),1,ThreadID)
по адресу можно передать много чего, в примере передается группа, которая разбирается топорным копированием по memcpy

Код: Выделить всё

memcpy(address(locWaitStruct),lpWaitStruct,size(WaitStruct))
Все сайты закрыты...
Koss
Бывалый
Сообщения: 57
Зарегистрирован: 27 Март 2009, 15:38

Re: Как создать и убить Thread средствами WinAPI

Сообщение Koss »

WatchFileProc - это обычная виндовс бэхейрвором сделатая?
Аватара пользователя
StillZero
Ветеран
Сообщения: 454
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Контактная информация:

Re: Как создать и убить Thread средствами WinAPI

Сообщение StillZero »

Обычная кларина процедура, имя любое может быть, прототип как описано в MSDN, атрибут PASCAL необходим для всех API
Все сайты закрыты...
Аватара пользователя
WadimZapara
Активист
Сообщения: 181
Зарегистрирован: 11 Июнь 2008, 12:11
Откуда: Тамбов

Re: Как создать и убить Thread средствами WinAPI

Сообщение WadimZapara »

это работает

Код: Выделить всё

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) если процедура, где объявлена эта переменная, прекратит свою работу раньше, чем новый поток, а после этого последует в потоке обращение к данной переменной (через её адрес) - будет та же ошибка
- в обоих случаях программа упадёт
Компьютер имеет то преимущество перед мозгом, что им пользуются...
Ответить