![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание копии потока [D6, D7]
ksa2002 © (2006-08-11 11:17:00)Есть поток №1 и порт который он обслуживает
Если у нас 1 порт и 1 поток то всё нормально.
А ели 10 -20 портов? при этом они идентичны по событиям.
Не писать же мне один и тот же поток (меняя только имена портов). Наверно можно создать копию потока и передать ему переменную? (только я не знаю как :) )
GanibalLector (2006-08-11 23:56:00) [1]Вот,пример,кстати :
function Potok(Param: PMyMode): DWord;
begin
...
with Param^ do
begin
//
end;
Dispose(Param);
end;
procedure TWait.Go;
var ThreadID:DWord;
Ph: PMyMode; // типа моя структура
begin
New(Ph);
Ph^.Port:=Port;
Ph^.Baud:=Baud;
Ph^.Mode:=Mode;
Ph^.Handle:=Handle;
CloseHandle(BeginThread(nil,0,@Potok,Ph,0,ThreadId));
end;
ksa2002 (2006-08-11 12:49:00) [2]всё ) ...большое спасибо за помощь ) ..теперь я ещё немого поумнел )
Сергей М. (2006-08-11 12:46:00) [3]
> если ф-я которую я вызвал, в свою очередь обращается к дургой
> ф-и в данном потоке , это будет корректно вызванно ?
Да, конечно.
При этом следует понимать, что любая вызванная ф-ция выполняется в контексте того же потока, в котором выполняется вызывающая ф-ция.
> вызов Thread.Execute в которой вызываются другие ф-ии полностью
> будет работать непересеакаясь с другим потоком и нормально
> вызыватся?
Пересечение может быть только на уровне общих данных, если таковые имеются.
ksa2002 (2006-08-11 12:37:00) [4]понятно
ещё вопрос если ф-я которую я вызвал, в свою очередь обращается к дургой ф-и в данном потоке , это будет корректно вызванно ?
т.е. вызов Thread.Execute в которой вызываются другие ф-ии полностью будет работать непересеакаясь с другим потоком и нормально вызыватся?
Сергей М. (2006-08-11 12:29:00) [5]
> написано BeginThread spawns a new thread of execution
Как написано, так оно и есть - вызов BeginThread() порождает новыйпоток, в котором будет выполнена ф-ция, указанная параметром ThreadFunc.
Ф-ция ThreadFunc при этом сможет получить указанный параметр Parameter.
Попросту говоря, псевдокод
hThread1 = BeginThread(SomeThreadFunc, Param 1)
hThread1 = BeginThread(SomeThreadFunc, Param 2)
вызовет к жизни два независимых новых потока, выполняющих параллельно одну и ту же ф-цию, но с разными параметрами.
ksa2002 (2006-08-11 12:21:00) [6]почитал в хелпе и возник вопрос
BeginThread
(void * SecurityAttributes, unsigned StackSize, TThreadFunc ThreadFunc, void * Parameter, unsigned CreationFlags, unsigned &ThreadId);
т.е. идёт вызов ThreadFunc находямщя в потоке, где hreadId это ид потока который мы юзаем.
тобишь я вызово ф-ию она выполнится и всё ?? или она запустит поток с этого места (этой-фии) передав параметр? (хотя написано BeginThread spawns a new thread of execution and sets the global IsMultiThread variable)
мне непонятен механизм запуска потока в данном случаи .
Сергей М. (2006-08-11 11:18:00) [7]Функция BeginThread() для сей цели имеет вх.параметр (см.справку)