создать поток

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Koss
Бывалый
Сообщения: 57
Зарегистрирован: 27 Март 2009, 15:38

создать поток

Сообщение Koss »

Кто-нибудь пробовал через винапи это здесь делать?

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

 CreateThread(long,long,long,long,long,*long),raw,unsigned,pascal,name('createthread')
вот определил какбе.
И как теперь ссылку на ф-цию дать ?
LPTHREAD_START_ROUTINE lpStartAddress
как должен работать этот параметр ?
Аватара пользователя
StillZero
Ветеран
Сообщения: 454
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Контактная информация:

Re: создать поток

Сообщение StillZero »

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

Re: создать поток

Сообщение Koss »

А я смотрел эту тему, и примерчик качал.
В примерчеке - там вобще кнопка, которая запускает поток имеет следующий код:

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

 if WatchDir.Init(thread(),loc:DirName)
    message('Can not watch')
 end
не вкурил, признаться. Второй пост в теме можете пояснить?
CreateThread также описать с LONG и передавать ThreadProc как ADDRESS(ThreadProc)
в ThreadProc будет передаваться адрес lpParameter, получать данные из него по memcpy
Аватара пользователя
StillZero
Ветеран
Сообщения: 454
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Контактная информация:

Re: создать поток

Сообщение StillZero »

...... ответил блин в старой теме :)
см. здесь http://forum.clarionlife.net/phpbb/view ... 502#p13502
Все сайты закрыты...
Аватара пользователя
WadimZapara
Активист
Сообщения: 181
Зарегистрирован: 11 Июнь 2008, 12:11
Откуда: Тамбов

Re: создать поток

Сообщение 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
Компьютер имеет то преимущество перед мозгом, что им пользуются...
Koss
Бывалый
Сообщения: 57
Зарегистрирован: 27 Март 2009, 15:38

Re: создать поток

Сообщение Koss »

ещё вопрос.
В потоке реализую что-то вроде:

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

loop
if CLOCK() % 60 = 0 then что-нибудь .
do
почиму-то бывает, что не срабатывает. Есть в кларе 5.5 что-либо вроде delay () как в дельфи ?
понимаю, что if CLOCK() % 60 = 0 фиговая конструкция.
Вообще требуется в потоке делать что-либо в течении заданного промежутка времени
BOB
Ветеран
Сообщения: 336
Зарегистрирован: 17 Июль 2005, 5:43

Re: создать поток

Сообщение BOB »

По моему для 5.5 beep(частота в герцах,длительность в 1\100 сек) . Лучше help посмотри.
Koss
Бывалый
Сообщения: 57
Зарегистрирован: 27 Март 2009, 15:38

Re: создать поток

Сообщение Koss »

это же бибиканье.
В хелпе нашёл только клок()
BOB
Ветеран
Сообщения: 336
Зарегистрирован: 17 Июль 2005, 5:43

Re: создать поток

Сообщение BOB »

Ну и пусть себе бибикает с частотой 0 герц и нужной длительностью beep(0,1000).
Аватара пользователя
StillZero
Ветеран
Сообщения: 454
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Контактная информация:

Re: создать поток

Сообщение StillZero »

if CLOCK() % 60 = 0 then что-нибудь .
надо таймер создавать и ловить событие таймера, суммировать время прошедшее по таймеру и если превысило 60, то что то делать
таймер тоже через API создавать
Все сайты закрыты...
Аватара пользователя
WadimZapara
Активист
Сообщения: 181
Зарегистрирован: 11 Июнь 2008, 12:11
Откуда: Тамбов

Re: создать поток

Сообщение 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 секунд, будет убит (если, конечно, сам не завершится до этого).
Компьютер имеет то преимущество перед мозгом, что им пользуются...
Аватара пользователя
WadimZapara
Активист
Сообщения: 181
Зарегистрирован: 11 Июнь 2008, 12:11
Откуда: Тамбов

Re: создать поток

Сообщение WadimZapara »

Да, вдогонку - Sleep лучше не использовать.
Почему-то под некоторыми ОС (напр.W-98) - программа на Кларе засыпает и забывает проснуться...
Компьютер имеет то преимущество перед мозгом, что им пользуются...
Koss
Бывалый
Сообщения: 57
Зарегистрирован: 27 Март 2009, 15:38

Re: создать поток

Сообщение Koss »

попробовал внедрить в "боевой" исходник.
Заметил, что частенько вылетают всякие
File dbo.TableName could not be Opened. Error: Подключение занято до получения результатов для другого hstmt (S1000).
Аватара пользователя
WadimZapara
Активист
Сообщения: 181
Зарегистрирован: 11 Июнь 2008, 12:11
Откуда: Тамбов

Re: создать поток

Сообщение WadimZapara »

это из-за того, что ты работаешь в разных потоках операционной системы с одними и теми же данными
для избежания нужно использовать разделение доступа с помощью мютексов, критических секций и т.п.
или использовать вообще разные структуры

в объявлении файла в твоём случае давать атрибут THREAD и он будет использоваться как другой файл
Компьютер имеет то преимущество перед мозгом, что им пользуются...
Koss
Бывалый
Сообщения: 57
Зарегистрирован: 27 Март 2009, 15:38

Re: создать поток

Сообщение Koss »

я уже как бы понял.
Пробую не использовать эти вьюшки , а через
?OLE{PROP:Create} = 'ADODB.Connection'
Ответить