Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.07.2010, 19:59   #1
prod87
Пользователь
 
Регистрация: 24.10.2009
Сообщений: 48
Вопрос Программа подвисает

Подскажите..

К примеру есть такая процедура:
Код:
procedure TForm1.SpeedButton1Click(Sender: TObject);
var i:integer;
begin
for i:=1 to 9999 do
begin
StringGrid1.cells[0,i]:='aaa';
Stringgrid1.RowCount:=Stringgrid1.RowCount+1;
stringgrid1.Refresh;
end;
end;
Нафимая кнопку она начинает выполняться и вся программа висит.

Можно ли как то сделать так, что бы эта процедура выполняналсь, а в то время мог спокойно просматривать собержимое стринггрид и нажимать другие кнопки?
prod87 вне форума Ответить с цитированием
Старый 23.07.2010, 20:12   #2
ZaRDaK
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 197
По умолчанию

Возможно проблема решится добавлением Application.ProcessMessages(); в конец цикла. Если нет - изучайте как работают потоки (Thread) в дельфях.
ZaRDaK вне форума Ответить с цитированием
Старый 23.07.2010, 20:19   #3
grafgrial
Просто хороший
Форумчанин
 
Аватар для grafgrial
 
Регистрация: 26.03.2010
Сообщений: 562
По умолчанию

Ага, потоки, потоки нужно смотреть у меня такая же ерунда была (так называемое бесконечное окно)
Помог, нажми весы слева
grafgrial вне форума Ответить с цитированием
Старый 23.07.2010, 20:21   #4
prod87
Пользователь
 
Регистрация: 24.10.2009
Сообщений: 48
По умолчанию

Спасибо! Именно то, что надо
prod87 вне форума Ответить с цитированием
Старый 23.07.2010, 20:23   #5
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,689
По умолчанию

Ну накой они вам эти потоки?
Код:
procedure TForm1.SpeedButton1Click(Sender: TObject);
var i:integer;
begin
Stringgrid1.RowCount:=Stringgrid1.RowCount+9999;
for i:=1 to 9999 do
StringGrid1.cells[0,i]:='aaa';
stringgrid1.Refresh;
end;
10 тыс. в пределах долей секунд выполняется. А вот если там миллионы будут, то тогда да, лучше в поток.
eoln вне форума Ответить с цитированием
Старый 23.07.2010, 20:36   #6
prod87
Пользователь
 
Регистрация: 24.10.2009
Сообщений: 48
По умолчанию

Для того цикла, что я в примере указал подходит, а для программы, которую я пишу не очень.В примере шаг цикла выполняется очень быстро, по этому все работает хорошо Моя же программа сканирует открытые порты с помошью tcpclient. Время выполнения процедуры tcpclient.open, на сколько я понимаю, зависит от того, как быстро удаленный адресс откликнится, либо от таймаута(если нет никакой службы на данном порте). Время отклика у меня колебалось от меньше секунды до нескольких. И в это время программа висит..
Я так понимаю мне лучше поучить Thread?))
prod87 вне форума Ответить с цитированием
Старый 23.07.2010, 21:00   #7
ZaRDaK
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 197
По умолчанию

Да, особенно если хотите сделать сканер многопоточным.
ZaRDaK вне форума Ответить с цитированием
Старый 23.07.2010, 21:44   #8
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
Лампочка

Код:
procedure TForm1.SpeedButton1Click(Sender: TObject);
var i:integer;
begin
for i:=1 to 9999 do
begin
StringGrid1.cells[0,i]:='aaa';
Stringgrid1.RowCount:=Stringgrid1.RowCount+1; // это что-то непонятное... если вы хотите увеличить количество строк на 9999, то просто сделайте это перед циклом (а то 9998 лишних вызовов получается) -> StringGrid1.RowCount:=StringGrid1.RowCount+9999; // перед for
// stringgrid1.Refresh; // а из-за этого вообще тормозить будет, эту строку надо было
end;
// сюда написать... :)
end;
Не вчитывался что там с tcpclient, тока вроде antifrize можно на форму кинуть... Не то?
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 23.07.2010, 21:46   #9
prod87
Пользователь
 
Регистрация: 24.10.2009
Сообщений: 48
По умолчанию

Вот написал программу с двумя потоками. Как тут сделать, что бы форма не висла?

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Memo2: TMemo;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


  type
   TMyThread = class(TThread)
   private
     { Private declarations }
   protected
     procedure DoWork;
     procedure Execute; override;
   end;

   type
   TMyThread1 = class(TThread)
   private
     { Private declarations }
   protected
     procedure DoWork;
     procedure Execute; override;
   end;





var
  Form1: TForm1;
  T1   : TMyThread;
  T2   : TMyThread1;
implementation

{$R *.dfm}


procedure TMyThread.Execute;
 begin

   while not Terminated do
     Synchronize(DoWork);
 end;

 procedure TMyThread.DoWork;
 var i:integer;
 begin
 for i:=0 to 9999 do
 form1.Memo1.Lines.Add('aaa');

 end;



procedure TForm1.Button1Click(Sender: TObject);
begin
T1 := TMyThread.Create(False);
T2 := TMyThread1.Create(False);
T2.Priority:=tpNormal;
T1.Priority:=tpNormal;
T2.DoWork;
T1.DoWork;
end;



procedure TMyThread1.Execute;
 begin

   while not Terminated do
     Synchronize(DoWork);
 end;

 procedure TMyThread1.DoWork;
 var i:integer;
 begin
 for i:=0 to 9999 do
 form1.Memo2.Lines.Add('aaa');
 end;







end.
prod87 вне форума Ответить с цитированием
Старый 23.07.2010, 21:47   #10
prod87
Пользователь
 
Регистрация: 24.10.2009
Сообщений: 48
По умолчанию

DomiNick

Цикл там написан для примера, что бы нагрузить программу


п.с.
Что за antifrize и где взять?

Последний раз редактировалось prod87; 23.07.2010 в 21:54.
prod87 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
приложение подвисает, при попытке обновить шрифты AnTe Общие вопросы Delphi 2 07.12.2009 11:36
Много SQL запросов что компьютер подвисает!! Football_lady SQL, базы данных 4 28.11.2009 13:05
Программа открыается если есть другая программа. bookkc Паскаль, Turbo Pascal, PascalABC.NET 12 14.10.2009 20:09
При компилировании (F9) подвисает Delphi Polotenchik Общие вопросы Delphi 3 24.06.2009 13:44