Страница 1 из 2
создать поток
Добавлено: 22 Сентябрь 2010, 17:07
Koss
Кто-нибудь пробовал через винапи это здесь делать?
Код: Выделить всё
CreateThread(long,long,long,long,long,*long),raw,unsigned,pascal,name('createthread')
вот определил какбе.
И как теперь ссылку на ф-цию дать ?
LPTHREAD_START_ROUTINE lpStartAddress
как должен работать этот параметр ?
Re: создать поток
Добавлено: 23 Сентябрь 2010, 14:05
StillZero
Re: создать поток
Добавлено: 23 Сентябрь 2010, 14:16
Koss
А я смотрел эту тему, и примерчик качал.
В примерчеке - там вобще кнопка, которая запускает поток имеет следующий код:
Код: Выделить всё
if WatchDir.Init(thread(),loc:DirName)
message('Can not watch')
end
не вкурил, признаться. Второй пост в теме можете пояснить?
CreateThread также описать с LONG и передавать ThreadProc как ADDRESS(ThreadProc)
в ThreadProc будет передаваться адрес lpParameter, получать данные из него по memcpy
Re: создать поток
Добавлено: 24 Сентябрь 2010, 12:35
StillZero
Re: создать поток
Добавлено: 24 Сентябрь 2010, 21:47
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)
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))
! если Handle не нужен, сразу, или когда станет не нужен:
CloseHandle(h) ! обязательно
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
Re: создать поток
Добавлено: 26 Сентябрь 2010, 14:19
Koss
ещё вопрос.
В потоке реализую что-то вроде:
Код: Выделить всё
loop
if CLOCK() % 60 = 0 then что-нибудь .
do
почиму-то бывает, что не срабатывает. Есть в кларе 5.5 что-либо вроде delay () как в дельфи ?
понимаю, что if CLOCK() % 60 = 0 фиговая конструкция.
Вообще требуется в потоке делать что-либо в течении заданного промежутка времени
Re: создать поток
Добавлено: 26 Сентябрь 2010, 18:44
BOB
По моему для 5.5 beep(частота в герцах,длительность в 1\100 сек) . Лучше help посмотри.
Re: создать поток
Добавлено: 26 Сентябрь 2010, 19:43
Koss
это же бибиканье.
В хелпе нашёл только клок()
Re: создать поток
Добавлено: 27 Сентябрь 2010, 5:06
BOB
Ну и пусть себе бибикает с частотой 0 герц и нужной длительностью beep(0,1000).
Re: создать поток
Добавлено: 27 Сентябрь 2010, 8:11
StillZero
if CLOCK() % 60 = 0 then что-нибудь .
надо таймер создавать и ловить событие таймера, суммировать время прошедшее по таймеру и если превысило 60, то что то делать
таймер тоже через API создавать
Re: создать поток
Добавлено: 27 Сентябрь 2010, 10:34
WadimZapara
Совсем необязательно создавать таймер.
Достаточно использовать API-фунцию ожидания:
Код: Выделить всё
MAP
MODULE('Windows.dll')
GetLastError(), Long, Pascal, Dll
WaitForSingleObject(UnSigned Handle, ULong TimeOut_ms), ULong, Pascal, DLL, Proc
END
END
H UnSigned ! handle
MS ULong
WAIT_FAILED Equate(-1)
WAIT_OBJECT_0 Equate(0)
WAIT_TIMEOUT Equate(102h)
CODE
MS = 60 * 1000 ! 1 минута
! в H - получить handle отслеживаемого процесса, который должен исполняться в течение времени MS
! можно вообще - Handle своего процесса - он не закончится и сработка произойдёт по времени
WaitForSingleObject(H, MS)
! если нужно - можно узнать причину завершения ожидания
Case GetLastError()
Of WAIT_TIMEOUT
! время MS кончилось
Of WAIT_OBJECT_0
! ранее занятый Hanle освободился
Of WAIT_FAILED
! ошибка вызова
Else
! для разных объектов может быть ещё ряд причин - см. MSDN
End
В качестве H можно передать Handle созданного потока.
В результате функция вернёт управление на оператор Case GetLastError() после одного из двух событий: или поток завершит работу, или пройдёт указанное число миллисекунд
Добавь к примеру
отсюда перед
TerminateThread вызов
WaitForSingleObject(H, 60000) и твой поток, проработав 60 секунд, будет убит (если, конечно, сам не завершится до этого).
Re: создать поток
Добавлено: 27 Сентябрь 2010, 10:56
WadimZapara
Да, вдогонку - Sleep лучше не использовать.
Почему-то под некоторыми ОС (напр.W-98) - программа на Кларе засыпает и забывает проснуться...
Re: создать поток
Добавлено: 04 Октябрь 2010, 12:24
Koss
попробовал внедрить в "боевой" исходник.
Заметил, что частенько вылетают всякие
File dbo.TableName could not be Opened. Error: Подключение занято до получения результатов для другого hstmt (S1000).
Re: создать поток
Добавлено: 06 Октябрь 2010, 11:43
WadimZapara
это из-за того, что ты работаешь в разных потоках операционной системы с одними и теми же данными
для избежания нужно использовать разделение доступа с помощью мютексов, критических секций и т.п.
или использовать вообще разные структуры
в объявлении файла в твоём случае давать атрибут THREAD и он будет использоваться как другой файл
Re: создать поток
Добавлено: 06 Октябрь 2010, 16:17
Koss
я уже как бы понял.
Пробую не использовать эти вьюшки , а через
?OLE{PROP:Create} = 'ADODB.Connection'