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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> resume \suspend потока 
:(
    Опции темы
kartoshkins
Дата 30.8.2009, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



unit1:
Код


procedure TForm1.Button2Click(Sender: TObject);
var
new:infected//поток unit2
begin
new := Infected.create(true);
new.freeonterminate := true;
new.priority := tplowest;
new.resume;
end;



 как сделать в этой кнопке возможность остановки ,возобновления потока?
нужно имненно в 1 кнопке,тк если выношу  new:infected  в раздел var юнита1 начинаються глюки непонятные
  
PM MAIL   Вверх
kami
Дата 30.8.2009, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Цитата(kartoshkins @  30.8.2009,  14:18 Найти цитируемый пост)
нужно имненно в 1 кнопке,тк если выношу  new:infected  в раздел var юнита1 начинаються глюки непонятные

Глюки все равно имеют объяснение.
А если делать на первое нажатие создание и запуск потока, на второе - приостановка и т.д. то все равно нужно выносить переменную потока куда-нибудь (лучше наверное - в private секцию формы). Ибо после выхода из обработчика OnClick переменная потока "теряется" и new из первого клика <> new во втором клике (при втором клике в new будет мусор, который приведет к AV).

Это сообщение отредактировал(а) kami - 30.8.2009, 14:35
PM MAIL WWW   Вверх
kartoshkins
Дата 30.8.2009, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 
почему виснет форма при запуске потока?
 

Код

unit Unit2;

interface

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

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

implementation
uses unit1;


    procedure infected.UpdateCaption;
    begin

     while true do begin
     Form1.Caption := 'Updated in a thread';
     sleep(1);
     end;
    end;
{ infected }                //

procedure infected.Execute;
begin
      Synchronize(UpdateCaption);
end;

end.




PM MAIL   Вверх
kami
Дата 30.8.2009, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Если переменная new будет в private секции формы, то это будет выглядеть примерно так:
Код

TForm1=class(TForm)
......
private
  my_Thread:infected;
...........................
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if not Assigned(my_Thread) then
    begin
      my_Thread:=infected.Create(True);
      my_Thread.FreeOnTerminated:=True;
      my_Thread.Priority:=tpLowest;
    end;
  if my_Thread.Suspended then
    my_Thread.Resume
  else
    my_Thread.Suspend;
end;


только не забыть в OnClose или OnDestroy уничтожить поток.
PM MAIL WWW   Вверх
kartoshkins
Дата 30.8.2009, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



выдает ошибку [Error] Unit1.pas(22): Undeclared identifier: 'Infected'

вот как выглядит код:
Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private

     new: Infected; //Unit2
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
   flag:boolean;


implementation
  uses unit2;
{$R *.dfm}





uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,winsock, StdCtrls;  <------ сюда не хочет вставляться  пишет: [Fatal Error] Unit1.pas(7): Circular unit reference to 'Unit1'





и еще.. я тут нашел примерчик полегче:

Код


 var 
th:cardinal; 
   h:integer; 
begin            // 

 h := beginthread(nil, 1024, @qwert, nil, 0, th); 

end; 

можно как-то останавливать  возобновлять поток созданный через  beginthread?

Это сообщение отредактировал(а) kartoshkins - 30.8.2009, 14:46
PM MAIL   Вверх
kami
Дата 30.8.2009, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



kartoshkins, 
Поясни смысл использования дополнительного потока, если все, что в нем делается - идет через Synchronize, то есть в контексте основного потока. Получается, что дополнительный поток создается, но ничего кроме занимания ресурсов не делает.


Цитата(kartoshkins @  30.8.2009,  14:40 Найти цитируемый пост)
почему виснет форма при запуске потока?

А чего ты хотел?
Цитата(kartoshkins @  30.8.2009,  14:40 Найти цитируемый пост)

 procedure infected.UpdateCaption;    
begin     
  while true do 
    begin     
      Form1.Caption := 'Updated in a thread';     
      sleep(1);     
    end;    
end;

Это выполняется в основном потоке, потому что вызывается через Synchronize.
1. Ты не оставляешь никакого шанса приложению на выборку сообщений и их обработку, потому что основной поток бесконечно сидит в этом цикле.
2. Никакого толку от FreeOnTerminated нет, потому что цикл не предусматривает его обработку и выход оттуда.

PM MAIL WWW   Вверх
CodeMonkey
Дата 30.8.2009, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

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





--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
kartoshkins
Дата 30.8.2009, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В  в моем проекте без потоков (unit1) есть следующие ф-ии и процедуры:

Код
function cook(a:integer;Co:string):string;//
парсит текст из co возвращает string
...
end;



Код
function IdSock(size:integer):string;
var
  fsize:integer;
  Sock    : TSocket;
  Addr    : TSockAddr;
  HostEnt : PHostEnt;
  Res     : Integer;
  Buf     : array [0..350000] of Char;
  Source  : string;
  I:integer;
begin
создаеться сокет
отправляет Data , возвращает резальтат(html страничку) ,каторый нужно поместить в memo1;
end;


Код
procedure TForm1.Button2Click(Sender: TObject);
var

  ...

begin          

Data := 'GET /index.php HTTP/1.1' + #13#10 +
'Host: ' + Host + #13#10 +
'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)' + #13#10 +
'Accept: text/html' + #13#10 +
'Connection: close' + #13#10#13#10;
form1.Memo1.text:=Idsock(50000);
memo1.text:=cook(memo1.text);
memo1.lines.savetofile('ddd21');

Data := 'GET /index1.php HTTP/1.1' + #13#10 +
'Host: ' + Host + #13#10 +
'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)' + #13#10 +
'Accept: text/html' + #13#10 +
'Connection: close' + #13#10#13#10;
form1.Memo1.text:=Idsock(50000);
memo1.text:=cook(memo1.text);
memo1.lines.savetofile('dddrr');

Data := 'GET /index2.php HTTP/1.1' + #13#10 +
'Host: ' + Host + #13#10 +
'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)' + #13#10 +
'Accept: text/html' + #13#10 +
'Connection: close' + #13#10#13#10;
form1.Memo1.text:=Idsock(50000);
memo1.text:=cook(memo1.text);
memo1.lines.savetofile('ddd3');
 
end;



как я понимаю все это нужно перенести в unit2 с потоком,то что было в кнопке засунуть в Execute ?
а что дальше? просто никак не могу разобраться в структуре потоков

Это сообщение отредактировал(а) kartoshkins - 30.8.2009, 15:19
PM MAIL   Вверх
CodeMonkey
Дата 30.8.2009, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

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



Попробуйте вдумчиво почитать Многопоточность - как это делается в Delphi.
Возможно вас также заинтересует Выполнение кода в потоке без выделения его в процедуру.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
kartoshkins
Дата 30.8.2009, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

Возможно вас также заинтересует Выполнение кода в потоке без выделения его в процедуру.

спасибо!  то что надо) 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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