Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];

Вниз

Передача параметров в поток   Найти похожие ветки 

 
DKazurov ©   (2004-09-15 15:28) [0]

День добрый
Есть функция BeginThread(SecurityAttributes: Pointer; StackSize: LongWord; ThreadFunc: TThreadTunc; Parameter: Pointer; CreationFlags: LongWord; var Threadld:  LongWord):Integer;
С ее помощью из основной программы в цикле создается некоторое количество потоков, сколько их будет - неизвестно. Проблема в том что не получается передать в ThreadFunc какой-либо параметр, например - индекс создаваемого потока
var
 th1:cardinal;
 h1:integer;
------
skip
------
   for i := 0 to stringlist1.Count - 1 do
// как передать в param значение i?
   h1:=beginthread(nil,16000,ThreadFunc,param,0,th1);

и как получить потом в ThreadFunc значение этой переменной.
я предполагаю что заголовок функции выглядит как
function ThreadFunc(p:pointer):longint;
но получить значение "i" из "p" - не могу.

Заранее спасибо


 
default ©   (2004-09-15 15:38) [1]

кстати в Delphi 6 в хелпе написано
что TThreadFunc = function(Parameter: Pointer): Integer;
c stdcall-ом идёт, а в исходниках без
может в этом проблема?
а вообще делай Integer(P) и всё


 
Erik1 ©   (2004-09-15 15:42) [2]

Есть такой класс TThead если описать в нем проседуру Execute то в ней будет выполнятся твой код. А еще можно создать public property в которых будут вызыватся функции для чтения записи данных. В этих записях надо незабыть применить критические секции или другие обеъкты синхронизации. Для начала соведую посмотреть демо в поставке Delphi.


 
default ©   (2004-09-15 15:43) [3]

получить Integer(P)
передать Pointer(Param)


 
DKazurov ©   (2004-09-15 16:53) [4]

Спасибо за ответы

To default: использовал и с stdcall и без

To Erik1: Класс tthread не подходит по причине нюансов прерывания создаваемого потока (terminate), хотя может я и не совсем разобрался. Дело в том что в процедуре Execute описывается прерывание потока как значение переменной Terminated, но в том случае если выполнение потока остановилось (зависло) до проверки этой переменной - то снять его с помощью TThread.Terminate не удается.

Буду пробовать


 
суслик ©   (2004-09-15 17:07) [5]


> хотя может я и не совсем разобрался

это точно


> но в том случае если выполнение потока остановилось (зависло)

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


 
DKazurov ©   (2004-09-15 17:14) [6]

To суслик: И как же его жестоко убить?
кстати с использованием BeginThread зависший поток мгновенно убивается с помощью terminatethread(h1,0), но для TThread не отрабатывало


 
simpson ©   (2004-09-15 17:23) [7]

> DKazurov ©   (15.09.04 17:14) [6]
> И как же его жестоко убить?

А почему поток виснет?


 
Суслик ©   (2004-09-15 17:25) [8]


> To суслик: И как же его жестоко убить?

Не надо жестко убивать.

Надо писать так, чтобы в этом не было потребности.


 
DKazurov ©   (2004-09-15 17:31) [9]

To simpson: пишется программка для IP-аккаунтинга. Через определенные промежутки времени опрашивается циска на предмет активных web-подключений, получается n-количество ip-адресов, в потоках выполняется определение имени по ip, а его может и не быть. В итоге поток висит на определении имени, а дальше - либо снимается через таймаут, либо если пошел второй цикл опроса циски может зависнуть окончательно


 
panov ©   (2004-09-15 17:37) [10]

>DKazurov ©   (15.09.04 17:14) [6]

To суслик: И как же его жестоко убить?

TerminateThread


 
simpson ©   (2004-09-15 17:37) [11]

> DKazurov ©   (15.09.04 17:31) [9]

Пожалуйста, не пишите нежизнеспособных программ - Ваши пользователи скажут Вам спасибо.

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

Представить, что такие действия производятся периодически - просто страшно. Особенно, если период мал.

А вот это тоже интересное замечание:
> если пошел второй цикл опроса циски может
> зависнуть окончательно

То есть, синхронизация потоков тоже не предусмотрена?


 
Verg ©   (2004-09-15 17:42) [12]


>  В итоге поток висит на определении имени,


1. Допустим он там может и не висеть, все зависит от фантазии (WSAAsyncGetHostByAddr)

2. Применение TerminateThread черевато

TerminateThread is a dangerous function that should only be used in the most extreme cases. You should call TerminateThread only if you know exactly what the target thread is doing, and you control all of the code that the target thread could possibly be running at the time of the termination. For example, TerminateThread can result in the following problems:

If the target thread owns a critical section, the critical section will not be released.
If the target thread is allocating memory from the heap, the heap lock will not be released.
If the target thread is executing certain kernel32 calls when it is terminated, the kernel32 state for the thread"s process could be inconsistent.
If the target thread is manipulating the global state of a shared DLL, the state of the DLL could be destroyed, affecting other users of the DLL.


 
DKazurov ©   (2004-09-15 17:54) [13]


> Verg ©
1. Допустим он там может и не висеть, все зависит от фантазии (WSAAsyncGetHostByAddr)


А пример использования можно? для GetHostByAddr нашел, а для этой функции - нет


 
Erik1 ©   (2004-09-15 18:09) [14]

Надо не поток убивать а разобратся в тонкостях работы WinSocket и синхронизации потоков. У тебя поток должен начинать работу по получению события! Читай про TEvent. Опять вопрос неправильно поставлен.


 
DKazurov ©   (2004-09-15 18:11) [15]

Спасибо все еще раз, буду обдумывать... :)



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.038 c
8-1085232886
Вадим
2004-05-22 17:34
2004.10.03
Декодирование DTFM


1-1095082274
46_55_41_44
2004-09-13 17:31
2004.10.03
Как узнать, что MDI форма активна, если она вызывается из DLL.


14-1094455946
1008
2004-09-06 11:32
2004.10.03
Вдруг кому интересно.


1-1095567429
ArchValentin
2004-09-19 08:17
2004.10.03
Работа с компонентом ListView


1-1095455130
Evgenij
2004-09-18 01:05
2004.10.03
Модератор просто негодяй какой-то! Опять меня удалил!!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский