Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> При работе программы она на долго "подвисает", Application.ProcessMessages не помогает 
:(
    Опции темы
StealtH
Дата 19.10.2004, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 16.9.2004

Репутация: нет
Всего: нет



Ситуация такая. Есть программа, которая пингует некоторое количество хостов, а потом сортирует их по нужным параметрам. При запуске пинга в несколько потоков(через TThread) программа "подвисает", т.е. она не висит, она производит свои действия. Чтобы программа так себя не вела, я чуть ли не через каждую строку вставляю Application.ProcessMessages, но это не устраняет данной проблемы.

Помимо этого есть трабла с потоками, прога "выплевывает" только по два потока, и после выполнения их запускает еще два.

Подскажите в чем проблема в этих сутуациях. :stena
PM MAIL   Вверх
Illusion Dolphin
Дата 19.10.2004, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 36
Всего: 63



Application.ProcessMessages не поможет, дело в потоках. Дай кусок исходника. Если подвисает прога, то что-то неверное в синхронизации, покажи моменты общения потоков с программой хотя бы (а лучше ещё и момент создания потока с кодом самого потока).


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
StealtH
Дата 20.10.2004, 07:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 16.9.2004

Репутация: нет
Всего: нет



Вот держи кусок кода

Код

unit Unit1;
type
 TForm1 = class(TForm)
   Button1: TButton;
   Memo1: TMemo;
   StringGrid1: TStringGrid;
   XMLDocument1: TXMLDocument;
   Label1: TLabel;
   SpinEdit1: TSpinEdit;
.....................................................
type
 THTTPThread = class(TThread)
 private
   HostID:Integer;
   IP:String;
   Port:Integer;
 protected
   procedure Execute; override;
   procedure DoWork;
 public
   constructor Create(State:Boolean; GridRow:Integer);
 end;

var
 Form1: TForm1;
 HTTPThread: THTTPThread;

procedure TForm1.Button1Click(Sender: TObject);
var
 i, Rnd:Integer;
begin
 Memo1.Clear;
 for i:=1 to SpinEdit1.Value do
 begin
   Application.ProcessMessages;
   with THTTPThread.Create(True, i) do
   begin
     Priority:=tpLowest;
     Form1.Label3.Caption:=IntToStr(i);
     Application.ProcessMessages;
     Memo1.Lines.Add('Threader #'+ IntToStr(i) +' running');
     Sleep(3);
     Application.ProcessMessages;
     Resume;
   end;
 end;
end;

constructor THTTPThread.Create(State:Boolean; GridRow:Integer);
begin
 IP:='';
 HostID:=GridRow;
 FreeOnTerminate := True;
 IP:=Form1.StringGrid1.Cells[0, HostID];
 Port:=StrToInt(Form1.StringGrid1.Cells[1, HostID]);
 inherited Create(State);
end;

procedure THTTPThread.Execute;
begin
 Synchronize(DoWork);
 Application.ProcessMessages;
end;

procedure THTTPThread.DoWork;
var
 Str:String;
begin
 Application.ProcessMessages;
 Form1.StringGrid1.Cells[3,HostID]:=PingHost(PChar(IP));
 Application.ProcessMessages;
 Form1.StringGrid1.Cells[4,HostID]:=IPAddrToName(PChar(IP));
 Application.ProcessMessages;
...............................................................
 HostID:=0;
 IP:='';
 Application.ProcessMessages;
end;

.............................
//Рeализация пинга через WinAPI
function PingHost(IPAddr:PChar):String;
......................................
//Имя хоста тоже через WinAPI
function IPAddrToName(IPAddr : string): string;
......................................


PM MAIL   Вверх
Girder
Дата 20.10.2004, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Дело все в Synchronize - от него по возможности надо избавлятся :)
Для этого... заполнение данных на форме выдели в отдельную процедуру, которая будет обрабатывать сообщения от потоков(используй для этого PostMessage).

Это сообщение отредактировал(а) Girder - 20.10.2004, 09:21


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Dayana
Дата 20.10.2004, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 352
Регистрация: 6.10.2002
Где: Тель-Авив

Репутация: 2
Всего: 4



Я давно не писала потоки, но насколько я помню надо пользоваться семафорами, чтобы не происходило одновременного доступа к данным разных запущенных потоков. А у тебя явное обращение к форме в потоке...
PM MAIL ICQ   Вверх
Illusion Dolphin
Дата 20.10.2004, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 36
Всего: 63



Цитата
у тебя явное обращение к форме в потоке...

Посмотри внимательно: у него с этим всё нормально... Он всё делает в методе Synchronize...
Я бы сделал где-то так:
Код
type
THTTPThread = class(TThread)
private
HostID:Integer;
IP:String;
Port:Integer;
a : string;
b : integer;
protected
procedure Execute; override;
procedure DoWork;
procedure send;
public
constructor Create(State:Boolean; GridRow:Integer);
end;

procedure THTTPThread.Execute;
begin
DoWork;
end;

procedure THTTPThread.send;
begin
Form1.StringGrid1.Cells[b,HostID]:=a;
end;

procedure THTTPThread.DoWork;
var
Str:String;
begin
a:=PingHost(PChar(IP));
b:=3;
Synchronize(send);
a:=IPAddrToName(PChar(IP));
b:=4;
Synchronize(send);
...............................................................
HostID:=0;
IP:='';
end;

И никаких Application.ProcessMessages не нужно, в нитях они вообще левые.

Это сообщение отредактировал(а) Illusion Dolphin - 20.10.2004, 16:10


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
StealtH
Дата 20.10.2004, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 16.9.2004

Репутация: нет
Всего: нет



Действительно все дело было Synchronize(DoWork), убрал нити пошли нормально, пингует без искажений, вообщем все рульно спасибо добрые люди :)

Только еще один маленький вопросик: Сколько максимум можно нитей запустить в одном приложении, и как это можно узнать программно для различных операционок?
PM MAIL   Вверх
_hunter
Дата 21.10.2004, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



исходя из размера стека и ограничения в 4 гига ( NT (и 2 9х) )
програмно ( если не предыдущим способом ) -- запускать потоки, пока запускаются :)


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
StealtH
Дата 21.10.2004, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 16.9.2004

Репутация: нет
Всего: нет



Огромное всем спасибо, я думаю, что тему уже можно, закрыть. Но если у кого-то есть желание, то я думаю, что ее можно развить, для всеобщего обозрения :)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0924 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.