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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с приостановкой потока. 
V
    Опции темы
Ak47black
  Дата 4.10.2007, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Здравствуйте.
Я столкнулся со следущей ситуацией и не знаю как тут поступить.
Делаю поток и хочу из потока вызвать MessageBox и после этого сразу-же остановить поток.
Вот такой у меня получился тестовый код
Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    StringSection: TRTLCriticalSection;
    procedure TestProc(MessText: String);
  end;

var
  Form1: TForm1;
  TestThread: TTestThread;

implementation

{$R *.dfm}

procedure TForm1.TestProc(MessText: String);
begin
  EnterCriticalSection(StringSection);
  ShowMessage(MessText);
  LeaveCriticalSection(StringSection);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  TestThread:= TTestThread.Create(TestProc);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  InitializeCriticalSection(StringSection);
end;

end.


и код потока
Код

unit ThreadUnit;

interface

uses
  Classes;

type
  TTestProc = procedure(MessText: String) of object;

  TTestThread = class(TThread)
  public
    FTestProc: TTestProc;
    procedure MainProc;
    constructor Create(FTestProc_: TTestProc);
  protected
    procedure Execute; override;
  end;

implementation

procedure TTestThread.MainProc;
begin
  FTestProc('Hello');
  Suspend;
  //Do something else here ...
end;

procedure TTestThread.Execute;
begin
  MainProc;
end;

constructor TTestThread.Create(FTestProc_: TTestProc);
begin
  FTestProc:= FTestProc_;
  inherited Create(False);
end;

end.

Ошибка при нажатие кнопки
Цитата

'Canvas does not allow drawing'. 

Я как понимаю что тут изза того что нету синхронизации.
Synchronize я сделать немогу по причине что из того что я не смогу оттуда вызвать Suspend, а отдельно от вызова FTestProc тоже немогу сделать. 
Подскажите как-бы мне тут избежать ошибки?   smile 

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  V.rar 10,21 Kb
PM MAIL   Вверх
dumb
Дата 4.10.2007, 16:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



Цитата(Ak47black @  4.10.2007,  17:02 Найти цитируемый пост)
Synchronize я сделать немогу по причине что из того что я не смогу оттуда вызвать Suspend, а отдельно от вызова FTestProc тоже немогу сделать.
прости, ты действительно думаешь что это кто-то поймет?! smile

Цитата(Ak47black @  4.10.2007,  17:02 Найти цитируемый пост)
Я как понимаю что тут изза того что нету синхронизации.
это из-за того, что ты vcl юзаешь(ShowMessage) из неосновного потока. если, скажем, заменишь на ::MessageBox(0,MessText.c_str(),"blabla",0), то все будет ок.

не совсем понятно, зачем выносить код, выполняющийся в рабочем потоке, в метод формы... ну это бывает. но торможение потока изнутри потока... smile
PM MAIL   Вверх
Ak47black
Дата 4.10.2007, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

прости, ты действительно думаешь что это кто-то поймет?! smile

Пардон smile 
Я хотел сказать, что если вызвать Suspend из процедуры которая была вызвана с помошью Synchronize(), то она небудет работать.
Цитата

не совсем понятно, зачем выносить код, выполняющийся в рабочем потоке, в метод формы... ну это бывает. но торможение потока изнутри потока... smile 

У делаю рекурсивный поиск с возможностью остановки и возобновлением, а этот код который тут выложил отражает судь ошибки.
Цитата

это из-за того, что ты vcl юзаешь(ShowMessage) из неосновного потока

Да так есть, только как заюзать его без Synchronize и не получить ошибки?
PM MAIL   Вверх
Alexeis
Дата 4.10.2007, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Ak47black @  4.10.2007,  17:40 Найти цитируемый пост)
Да так есть, только как заюзать его без Synchronize и не получить ошибки? 


Цитата(dumb @  4.10.2007,  16:22 Найти цитируемый пост)
если, скажем, заменишь на ::MessageBox(0,MessText.c_str(),"blabla",0), то все будет ок.


Если на паскале то будет так MessageBox(0, 'Text', 'Caption', 0); 
MessageBox - это апи функция, которая не связана общим ресурсом с формой потому работает безо всякой синхронизации.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ak47black
Дата 4.10.2007, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Но ошибка возникает.
А какие способы кроме Synchronize() еше есть?

Это сообщение отредактировал(а) Ak47black - 4.10.2007, 17:57
PM MAIL   Вверх
Alexeis
Дата 4.10.2007, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Ak47black @  4.10.2007,  17:57 Найти цитируемый пост)
Но ошибка возникает.

Значит она связана с чем-то другим. Покажи свой код с MessageBox.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MetalFan
Дата 4.10.2007, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



а зачем потоку, который занимается поиском, что-то пользователю показывать?! не отдать ли это на откуп осн.потоку?
я бы пересмотрел подход, а не извращенствами занимался)

Это сообщение отредактировал(а) MetalFan - 4.10.2007, 18:11


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Ak47black
Дата 4.10.2007, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Alexeis, в прикрепленном файле 1 пост исходник с MessageBoxом.

Добавлено через 1 минуту и 52 секунды
Цитата

не отдать ли это на откуп осн.потоку?

А это примерно как?
PM MAIL   Вверх
Alexeis
Дата 4.10.2007, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Ak47black, еще раз скажу MessageBox и ShowMessage это не одно и тоже. В прикрепленном проекте используется ShowMessage, а не MessageBox.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ak47black
Дата 4.10.2007, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Alexeis, ок. Понял. Сорри я спутал.
Я решил эту проблему вот таким путем, вынес в главный поток
Код

procedure TTestThread.DoInMainThread;
begin
  FTestProc('Hello');
end;

procedure TTestThread.MainProc;
begin
  Synchronize(DoInMainThread);
  Suspend;
  //Do something else here ...
end;

Извиняюсь что создал эту тему.
Спасибо всем кто участвовал.


Это сообщение отредактировал(а) Ak47black - 4.10.2007, 19:38
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.0602 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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