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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2010, 14:29   #1
Belfigor
Пользователь
 
Регистрация: 28.02.2010
Сообщений: 12
По умолчанию TThread вылетают ошибки

создаю в приложении два потока
Код:
TMainLoop = class(TThread)
  private

  protected
    procedure Execute; override;
  end;

  TTestLoop = class(TThread)
  private

  protected
    procedure Execute; override;
  end;
При создании формы указываю:
Код:
Var
  MainLoop: TMainLoop;
  TestLoop: TTestLoop;
Begin
  //Çàïóñêàåì MainLoop
  MainLoop:=TMainLoop.Create(true);
  MainLoop.FreeOnTerminate:=true;
  MainLoop.Priority:=tpLower;
  MainLoop.Resume;

  //Çàïóñêàåì TestLoop
  TestLoop:=TTestLoop.Create(true);
  TestLoop.FreeOnTerminate:=true;
  TestLoop.Priority:=tpLower;
  TestLoop.Resume;
End;
далее в самом коде указываю:
Код:
Procedure TMainLoop.Execute;
var testt:integer;
Begin
    //CriticalSection.Enter;
    testt:=0;
    While 1=1 do Begin
        While InWork Do Begin
            Form1.label1.Caption:=inttostr(testt);
            testt:=testt+1 ;
            sleep(10)
        End;
        sleep(10);
    End;
    //CriticalSection.Leave;
End;

Procedure TTestLoop.Execute;
var i:integer;
Begin
    //CriticalSection.Enter;
    i:=0;
    While 1=1 do Begin
        While InDraw Do Begin
            Form1.label18.Caption:=inttostr(i);
            i:=i+1;
            sleep(10)
        End;
        sleep(10);
    End;
    //CriticalSection.Leave;
End;
и создаю две кнопки которые и управляют состояниями потоков.

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
    InWork:= NOT InWork;
    if InWork then begin
        Button1.Caption:='Stop'
    end else begin
        Button1.Caption:='Start'
    end;
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
   InDraw:= NOT InDraw;
    if InDraw then begin
        Button7.Caption:='Stop'
    end else begin
        Button7.Caption:='Start'
    end;
end;

Все работает, потоки независимо друг от друга запускаются и останавливаются по нажатию на свои кнопки, через некоторое время выводится сообщение прикрепленное на скрине внизу.
Подскажите как с этим бороться
Изображения
Тип файла: jpg screenshoot_11.03.2010_16.23.42.jpg (37.2 Кб, 169 просмотров)

Последний раз редактировалось Belfigor; 11.03.2010 в 15:11.
Belfigor вне форума Ответить с цитированием
Старый 11.03.2010, 14:58   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Синхронизация где?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.03.2010, 15:00   #3
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Изучите примерчик, который есть у вас под руками в ...\Borland\Delphi7\Demos\Threads
mihali4 вне форума Ответить с цитированием
Старый 11.03.2010, 15:10   #4
Belfigor
Пользователь
 
Регистрация: 28.02.2010
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
Синхронизация где?
А как мне осуществить вывод с помощью синхронизации? Пытаюсь сделать так:
Код:
procedure TTestloop.DoWork(i:integer);
begin
    Form1.label1.Caption:=inttostr(i);
end;

procedure TMainLoop.DoWork(i:integer);
begin
    Form1.label18.Caption:=inttostr(i);
end;

Procedure TMainLoop.Execute;
var i:integer;
Begin
    //CriticalSection.Enter;
    i:=0;
    While 1=1 do Begin
        While InWork Do Begin
            Synchronize(DoWork(i));
            i:=i+1;
            sleep(10)
        End;
        sleep(10);
    End;
    //CriticalSection.Leave;
End;

Procedure TTestLoop.Execute;
var i:integer;
Begin
    //CriticalSection.Enter;
    i:=0;
    While 1=1 do Begin
        While InDraw Do Begin
            Synchronize(DoWork(i))  ;
            i:=i+1                ;
            sleep(10)              ;
        End;
        sleep(10);
    End;
    //CriticalSection.Leave;
End;
мне пишет
[Error] Unit1.pas(269): There is no overloaded version of 'Synchronize' that can be called with these arguments
[Error] Unit1.pas(285): There is no overloaded version of 'Synchronize' that can be called with these arguments


Цитата:
Сообщение от mihali4 Посмотреть сообщение
Изучите примерчик, который есть у вас под руками в ...\Borland\Delphi7\Demos\Threads
Я пытался

Последний раз редактировалось Belfigor; 11.03.2010 в 15:18.
Belfigor вне форума Ответить с цитированием
Старый 11.03.2010, 15:13   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

метод синхронизации это метод без параметров
используйте или глобальные переменные или поля класса TThread(дополнительно свои обьявите)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.03.2010, 15:24   #6
Belfigor
Пользователь
 
Регистрация: 28.02.2010
Сообщений: 12
По умолчанию

Спасибо! Счетчики снова побежали, подожду минут 10 надеюсь теперь крашей не будет. А не подскажете как использовать поля класса TThread, в смысле как их дополнительно объявить?
Belfigor вне форума Ответить с цитированием
Старый 11.03.2010, 15:28   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
TMainLoop = class(TThread)
  private
    FInt:Integer;//насчет F это привычка, да и хороший тон.
  protected
    procedure Execute; override;
  end;
теперь эта переменная доступна внутри Execute этого класса
и так же других методов этого класса(DoWork например)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.03.2010, 15:50   #8
Belfigor
Пользователь
 
Регистрация: 28.02.2010
Сообщений: 12
По умолчанию

Большое спасибо, возьму этот метод на вооружение :3.
Belfigor вне форума Ответить с цитированием
Старый 12.05.2011, 14:11   #9
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

Уважаемые, подкинте мысль, щас попробую более менее понятно объяснить структуру проекта

есть форма консоли

Код:
  TConsole = class(TForm)
   ....
  public
   procedure Write(Text: string);
   Function InputText(): string;
   Function InputInt(base: byte = 10; issign: boolean = true): integer;
  end;
Есть поток который обращается к этой консоли но обращения происходят через указатели функций...

Код:
TThreadMachine = class(tThread)
  private
   frun: boolean;
  public
   procedure StopMachine;
   procedure Execute; override;
   Property RunningIs:boolean read frun;
end;

PPStrOut = procedure (text: string) of object;
PFStrIn  = Function(): string  of object;
PFIntIn  = Function(base: byte; issign: boolean): Integer  of object;

Strout, ErrorOut: PPstrOut;
Strin : PFStrIn;
IntIn : PFIntIn;

procedure TThreadMachine.Execute;
begin
if frun then exit;
frun := true;
Pusk();
// вот тут вся загвозка
ErrorOut('Сообщение. Выполнение программы завершено.'); //как здесь обеспечить синхронизацию
frun := false;
end;
если к консоли обращаться из обычного потока то все нормально, обращаюсь из потока начинается... загрузка проца 100%, и ни чего не выводит.

форма консоли не знает о существовании потока, к ней просто приходят сообщения,
тоже самое и поток не знает о существовании консоли он просто по отправляет данные
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TThread в С++ Builder alun C++ Builder 7 02.06.2010 21:55
Вылетают АБСОЛЮТНО ВСЕ программы... Aviator Безопасность, Шифрование 39 23.01.2010 22:53
TThread и GUI Freezer Общие вопросы Delphi 8 05.08.2009 11:50
Вылетают игрушки... romeo007.06 Компьютерное железо 15 26.05.2008 15:51
использование TThread amandra Общие вопросы Delphi 6 03.05.2008 03:13