Страница 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
...... ответил блин в старой теме :)
см. здесь http://forum.clarionlife.net/phpbb/view ... 502#p13502

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'