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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.06.2011, 20:23   #1
spydark91
Форумчанин
 
Регистрация: 01.06.2011
Сообщений: 215
По умолчанию Проблемы с потоком

Код:
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls;
 
type
  Tstatysbusy = class(TForm)
  ProgressBar1: TProgressBar;
  Label1: TLabel;
 
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormHide(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
type
  TMyThread = class(TThread)
  ProgressBar1: TProgressBar;
  Label1: TLabel;
  protected
    procedure Execute; override;
  end;
 
var
  statysbusy: Tstatysbusy;
  i,c:integer;
  MyThread: TMyThread;
 
implementation
uses unit2, Unit7;
 
{$R *.dfm}
procedure TMyThread.Execute;
var p,m,ii:integer;
begin
for ii:=1 to 10 do
begin
if unit2.stat=0 then
 begin
   p:=p+1;
   ProgressBar1.Position:= p;
     if i=0 then
       begin
         label1.Caption:='Посылаем данные о подключении.';
         i:=1;
       end;
     if i=1 then
       begin
         label1.Caption:='Посылаем данные о подключении..';
         i:=2;
       end;
     if i=2 then
       begin
         label1.Caption:='Посылаем данные о подключении...';
         i:=0;
       end;
end
  else if unit2.stat=1 then
    begin
     if i=0 then
       begin
         label1.Caption:='Информируем о выходе.';
         i:=1;
       end;
     if i=1 then
       begin
         label1.Caption:='Информируем о выходе..';
         i:=2;
       end;
     if i=2 then
       begin
         label1.Caption:='Информируем о выходе...';
         i:=0;
       end;
    end;
  //удаление моего письма
 
sleep(500);
end;
 
 
 
 
 
 
 
 
end;
 
 
procedure Tstatysbusy.FormCreate(Sender: TObject);
begin
i:=0;
MyThread := TMyThread.Create(true);
 
end;
 
procedure Tstatysbusy.FormPaint(Sender: TObject);
begin
if unit2.stat=0 then
  ProgressBar1.Max:=10;
end;
 
procedure Tstatysbusy.FormShow(Sender: TObject);
begin
MyThread.resume;
 
end;
 
procedure Tstatysbusy.FormHide(Sender: TObject);
begin
MyThread.Suspend;
end;
 
end.
дает ошибку

врожде правельно делаю
1 создаю поток,но не запуская
2 при открытии формы запускаю поток
3 при закрытии выключаю

помогите плиз
Изображения
Тип файла: jpg Безымянный.jpg (282.7 Кб, 155 просмотров)
spydark91 вне форума Ответить с цитированием
Старый 16.06.2011, 21:02   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> врожде правельно делаю

чё правильно-то? нельзя вызывать VCL код из контекста не основного потока.
Или вы считаете, что если скопировали объявления контролов внутрь потока:

Код:
  ProgressBar1: TProgressBar;
  Label1: TLabel;
то теперь они магическим образом стали многопоточно-защищёнными?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 16.06.2011 в 21:11.
veniside вне форума Ответить с цитированием
Старый 16.06.2011, 21:09   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Кроме этого поток не правильно завершается и память не освобождается. И зачем в определении потока ProgressBar1: TProgressBar; и Label1: TLabel;?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 16.06.2011 в 21:15.
Аватар вне форума Ответить с цитированием
Старый 16.06.2011, 21:36   #4
spydark91
Форумчанин
 
Регистрация: 01.06.2011
Сообщений: 215
По умолчанию

потому что если убрать их оттужа то ошибка [Error] Unit1.pas(49): Undeclared identifier: 'ProgressBar1'и тоже самое с label

помогите пожалуйста,я только сегдня столкнулся с потоками,очень очень надо
spydark91 вне форума Ответить с цитированием
Старый 16.06.2011, 22:24   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Вот и хорошо, что Undeclared, Дельфи вам сама как бы подсказывает, что нечего из чужого потока лезть на форму.

Хотите обновлять ProgressBar/Label на форме из потока? Делайте это через Synchronize(), а лучше через сообщения.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 17.06.2011, 11:36   #6
spydark91
Форумчанин
 
Регистрация: 01.06.2011
Сообщений: 215
По умолчанию

сделал так,ошибок нет,но ни бар ни тотччечки не катаются
Код:
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls;
 
type
  Tstatysbusy = class(TForm)
  ProgressBar1: TProgressBar;
  Label1: TLabel;
 
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormHide(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
type
  TMyThread = class(TThread)
 
 
  protected
    procedure Execute; override;
  end;
 
var
  statysbusy: Tstatysbusy;
  i,c:integer;
  MyThread: TMyThread;
 
implementation
uses unit2, Unit7;
 
{$R *.dfm}
procedure TMyThread.Execute;
var p,m,ii:integer;
begin
for ii:=1 to 10 do
begin
if unit2.stat=0 then
 begin
   p:=p+1;
   statysbusy.ProgressBar1.Position:= p;
     if i=0 then
       begin
         statysbusy.label1.Caption:='Посылаем данные о подключении.';
         i:=1;
       end;
     if i=1 then
       begin
         statysbusy.label1.Caption:='Посылаем данные о подключении..';
         i:=2;
       end;
     if i=2 then
       begin
         statysbusy.label1.Caption:='Посылаем данные о подключении...';
         i:=0;
       end;
end
  else if unit2.stat=1 then
    begin
     if i=0 then
       begin
         statysbusy.label1.Caption:='Информируем о выходе.';
         i:=1;
       end;
     if i=1 then
       begin
        statysbusy.label1.Caption:='Информируем о выходе..';
         i:=2;
       end;
     if i=2 then
       begin
         statysbusy.label1.Caption:='Информируем о выходе...';
         i:=0;
       end;
  //удаление моего письма
     end
  else if unit7.stat=3 then
     begin
   p:=p+1;
   statysbusy.ProgressBar1.Position:= p;
     if i=0 then
       begin
         statysbusy.label1.Caption:='Формируем список.';
         i:=1;
       end;
     if i=1 then
       begin
         statysbusy.label1.Caption:='Формируем список..';
         i:=2;
       end;
     if i=2 then
       begin
         statysbusy.label1.Caption:='Формируем список...';
         i:=0;
       end;
end;
 
 
 
 
sleep(500);
end;
 
 
 
 
 
 
 
 
end;
 
 
procedure Tstatysbusy.FormCreate(Sender: TObject);
begin
i:=0;
MyThread := TMyThread.Create(true);
 
 
end;
 
procedure Tstatysbusy.FormPaint(Sender: TObject);
begin
if unit2.stat=0 then
  ProgressBar1.Max:=10;
end;
 
procedure Tstatysbusy.FormShow(Sender: TObject);
begin
MyThread.resume;
 
end;
 
procedure Tstatysbusy.FormHide(Sender: TObject);
begin
MyThread.Suspend;
end;
 
end.
spydark91 вне форума Ответить с цитированием
Старый 18.06.2011, 00:04   #7
spydark91
Форумчанин
 
Регистрация: 01.06.2011
Сообщений: 215
По умолчанию

есть кто живой?
spydark91 вне форума Ответить с цитированием
Старый 18.06.2011, 00:22   #8
romlo
Пользователь
 
Аватар для romlo
 
Регистрация: 21.06.2010
Сообщений: 49
По умолчанию

Допиши под строчкой " { Private declarations }" это:
Код:
procedure OnMyMess(var Mess : TMessage); message WM_USER+1;
Нажми ctrl+Shift+c
Скопируй все действия, которые ты выполняешь в потоке в созданную процедуру,
а в самом потоке вместо всех этих действий напиши:
Код:
SendMessage(statysbusy.handle, WM_USER+1, 0, 0);
Радуйся, если работает!

Последний раз редактировалось romlo; 18.06.2011 в 01:12. Причина: Не ту комбинацию клавиш указал
romlo вне форума Ответить с цитированием
Старый 20.06.2011, 16:49   #9
spydark91
Форумчанин
 
Регистрация: 01.06.2011
Сообщений: 215
По умолчанию

нет,не работает
Код:
unit Unit1;

interface

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

type
  Tstatysbusy = class(TForm)
  ProgressBar1: TProgressBar;
  Label1: TLabel;

    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormHide(Sender: TObject);
  private
    { Private declarations }
    procedure OnMyMess(var Mess : TMessage); message WM_USER+1;
  public
    { Public declarations }
  end;
type
  TMyThread = class(TThread)


  protected
    procedure Execute; override;
  end;

var
  statysbusy: Tstatysbusy;
  i,c:integer;
  MyThread: TMyThread;

implementation
uses unit2, Unit7;

{$R *.dfm}
procedure TMyThread.Execute;
begin
SendMessage(statysbusy.handle, WM_USER+1, 0, 0);
end;















procedure Tstatysbusy.FormCreate(Sender: TObject);
begin
i:=0;
MyThread := TMyThread.Create(true);



end;

procedure Tstatysbusy.FormPaint(Sender: TObject);
begin
if unit2.stat=0 then
  ProgressBar1.Max:=10;
end;

procedure Tstatysbusy.FormShow(Sender: TObject);
begin
MyThread.resume;

end;

procedure Tstatysbusy.FormHide(Sender: TObject);
begin
MyThread.Suspend;
end;

procedure Tstatysbusy.OnMyMess(var Mess: TMessage);
var p,m,ii:integer;
begin
for ii:=1 to 4 do
begin
if unit2.stat=0 then
 begin
   p:=p+1;
   statysbusy.ProgressBar1.Position:= p;
     if i=0 then
       begin
         statysbusy.label1.Caption:='Ïîñûëàåì äàííûå î ïîäêëþ÷åíèè.';
         i:=1;
       end;
     if i=1 then
       begin
         statysbusy.label1.Caption:='Ïîñûëàåì äàííûå î ïîäêëþ÷åíèè..';
         i:=2;
       end;
     if i=2 then
       begin
         statysbusy.label1.Caption:='Ïîñûëàåì äàííûå î ïîäêëþ÷åíèè...';
         i:=0;
       end;
end
  else if unit2.stat=1 then
    begin
     if i=0 then
       begin
         statysbusy.label1.Caption:='Èíôîðìèðóåì î âûõîäå.';
         i:=1;
       end;
     if i=1 then
       begin
        statysbusy.label1.Caption:='Èíôîðìèðóåì î âûõîäå..';
         i:=2;
       end;
     if i=2 then
       begin
         statysbusy.label1.Caption:='Èíôîðìèðóåì î âûõîäå...';
         i:=0;
       end;
  //óäàëåíèå ìîåãî ïèñüìà
     end
  else if unit7.stat=3 then
     begin
   p:=p+1;
   statysbusy.ProgressBar1.Position:= p;
     if i=0 then
       begin
         statysbusy.label1.Caption:='Ôîðìèðóåì ñïèñîê.';
         i:=1;
       end;
     if i=1 then
       begin
         statysbusy.label1.Caption:='Ôîðìèðóåì ñïèñîê..';
         i:=2;
       end;
     if i=2 then
       begin
         statysbusy.label1.Caption:='Ôîðìèðóåì ñïèñîê...';
         i:=0;
       end;

     sleep(500);
     end;

end;

end;
end.
Изображения
Тип файла: jpg Безымянный.jpg (273.6 Кб, 145 просмотров)
spydark91 вне форума Ответить с цитированием
Старый 20.06.2011, 16:49   #10
spydark91
Форумчанин
 
Регистрация: 01.06.2011
Сообщений: 215
По умолчанию

и еще такая ошибка
Изображения
Тип файла: jpg Безымянный.jpg (255.7 Кб, 140 просмотров)
spydark91 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с потоком Yur@ Общие вопросы Delphi 3 02.06.2011 12:46
Проблема с потоком timur oO Помощь студентам 2 14.04.2010 17:02
Delphi Проблема с потоком TreadProblem Помощь студентам 1 07.03.2010 17:59
Проблема с потоком Araver Общие вопросы Delphi 4 16.10.2007 04:30