Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

api-потоки, создание-разрушение [D6, WinXP]


Страницы:   1 2 3 4 5

Незнайка Винидиктович ©   (2009-03-29 18:25:00) 

Вот такая проблема случилась: Пишу подобие сокс5-сервера, с сипользование winapi-потоков, т.е. при старте запускаеться отдельный поток в котором крутиться бесконечный цикл с Accept, и как только есть подключившийся сокет, он создает поток и передает этот сокет туда... Так вот странность какая, что вродебы никаких общих переменных нету, никакой синхронизации нету(за её ненадобностью), т.е. все потоки существуют отдельно друг от друга. Так вот откудато берется ошибка памяти ((

В потоке примерно вот такая штука крутиться:

       while True do
       begin
               FD_Zero(FDSet);
               FD_Set(srv_sock,FDSet);

               //åñëè åñòü êëèåíò, òî ïåðåäàåì ñîêåò â êëèåíòñêèé ïîòîê
               Select(0,@FDSet,nil,nil,@timeout);
               if FD_IsSet(srv_sock,FDSet) then
               begin
                       accepted_sock:=Accept(srv_sock,@Addr,@addr_size);
                       CreateThread(nil, 0, @cli_thread, pointer(accepted_sock), 0, h);
               end;
       end;


Так вот кстати, как правельно разрушать потоки???
изнутри ExitThread(0); недостаточно? или как это правельно вообще делаеться?


аноним   (2009-04-10 13:54:00) [1]

Всу вы паскалисты на одно лицо :)


DVM   (2009-04-10 13:25:00) [2]


> аноним   (10.04.09 04:26) [94]
>
> Просто чел уже использовал BeginThread, а ему продолжали
> втирать про IsMultiThread, что было уже безсмысленно.

Так. Ты все опять не так прочитал.

в посте [0] написано:


CreateThread(nil, 0, @cli_thread, pointer(accepted_sock), 0, h);


в посте [4] это я ему предложил использовать:


 hClientThread := BeginThread(nil, 0, @SocketThread, Info, 0, ThreadId);



между [0] и [4] нет никаких упоминаний о BeginThread.

С чего ты взял, что автор использовал уже BeginThread?


аноним   (2009-04-10 04:26:00) [3]

Просто чел уже использовал BeginThread, а ему продолжали втирать про IsMultiThread, что было уже безсмысленно.
Кстати в последней студии С однопоточных библиотек уже нет, и такой проблемы тоже нет, почему разрабы делфей так же не поступили не понятно.


DVM   (2009-04-09 19:02:00) [4]


> аноним   (09.04.09 15:45) [92]


> BeginThread это "IsMultiThread := TRUE" делает сам

А я что написал? Прочитай пост [10] еще раз только ВНИМАТЕЛЬНО.


аноним   (2009-04-09 15:45:00) [5]


> Как это расходится с написанным мною?

BeginThread это "IsMultiThread := TRUE" делает сам


only_wmz   (2009-04-09 10:21:00) [6]

и вообще конструкция вида CloseHandle(BeginThread(...)) в случае не удачного создания потока, просто вернет 0 и ничего плохого не случиться или ... ?


only_wmz   (2009-04-09 10:19:00) [7]

Бггг ) Ситуация вообще получаеться ниопределенная, т.е. то увеличивается, то нет, на моей машине увеличивается(вин_хп), на другой(вин_хп) не увеличиваеться, на ещё другее(вин2003север) тоже то увеличиваеться, то нет, и ещё какая странность, что  в диспетчере на моей машине показывает что запущено 5 поток, когда на самом деле в спокойном положении там 2 потока крутится ))


Сергей М.   (2009-04-09 08:32:00) [8]

Ну тогда прыгай с бубном.
Приводить полный обновленный код ты ведь не намерен)


only_wmz   (2009-04-09 08:28:00) [9]


> > результат то все равно не достигнутЕсли ты выполнил вышеупомянутые
> рекомендации, то достигнут.

Ну так ничего не поменялось емаё )) как это достигнут?
Да в мемпруфе показывает по нулям, но в диспетчере растет )


Сергей М.   (2009-04-08 22:00:00) [10]


> результат то все равно не достигнут


Если ты выполнил вышеупомянутые рекомендации, то достигнут.


> аноним   (08.04.09 20:30) [85]


С пробужденьицем !)


DVM   (2009-04-08 21:58:00) [11]


> аноним   (08.04.09 20:30) [85]

Как это расходится с написанным мною?


аноним   (2009-04-08 20:30:00) [12]


> Еще, ты решил использовать CreateThread вместо BeginThread,
>  надеюсь, не забыл про выставление флага IsMultiThread :
> = TRUE;

BeginThread spawns a new thread of execution and sets the global IsMultiThread variable, thereby making the heap thread-safe.


аноним   (2009-04-08 19:58:00) [13]

Создавать 1000 потоков само по себе экстремально, каждый поток, по умолчанию, забирает 1М на стек


only_wmz   (2009-04-07 11:20:00) [14]


> Полторы недели времени и 80 постов понадобилось, чтобы все-
> таки закрыть наконец-то хэндлы !)

Ну а результат то все равно не достигнут (


Сергей М.   (2009-04-07 08:24:00) [15]


> добавил CloseHandle(BeginThread


Полторы недели времени и 80 постов понадобилось, чтобы все-таки закрыть наконец-то хэндлы !)


only_wmz   (2009-04-07 08:11:00) [16]


> а в трее то что творится? ;)

Там что-то нетак?


only_wmz   (2009-04-07 08:10:00) [17]

добавил CloseHandle(BeginThread(...));

В мемпруфе стало показывать что потоков 0, но на память никак не повлияло


brother   (2009-04-07 08:00:00) [18]

а в трее то что творится? ;)


only_wmz   (2009-04-07 07:56:00) [19]

http://s54.radikal.ru/i143/0904/4c/0e0585e83372.jpg
кол-во потоков не уменьшается, но ресурсов они занимают ноль )

http://i036.radikal.ru/0904/c4/8216f033000f.jpg
хотя здесь пишет что завершаются


only_wmz   (2009-04-07 07:53:00) [20]

Т.е. выходит из потока тогда, когда возвращает значение функция, я так и думал...

Ток вот странно, запустил через мемпруф, все ресурсы освобождаються все ок, кроме того что число потоков не уменьшаеться, хотя ресурсов они(потоки) занимают ноль, и главно если в дибагфиндов посматреть там пишеться что потоки завершаються. щас скрины короч сниму


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо