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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Показать popup menu в отдельном потоке 
V
    Опции темы
bazzzman
Дата 2.5.2007, 07:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Пытаюсь показать popup menu в отдельном потоке
Код

var
  Form1: TForm1;
  Pop: TPopupMenu;

implementation

{$R *.dfm}

procedure TrayThreadProc; StdCall;
begin
 if TrackPopupMenu(Pop.Items.Handle, 0, 0, 0, 0 { reserved }, PopupList.Window, nil) = false then RaiseLastOSError;

 while true do
 begin
  Application.ProcessMessages;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var Dummy: Cardinal;
begin
 Pop.Items.Add(NewItem('123', 0, false, true, nil, 0, 'na'));
 CreateThread(nil,0,@TrayThreadProc,nil,0,Dummy);
end;

initialization
 Pop := TPopupMenu.Create(nil);

finalization
 Pop.Free;

end.


Ничего не выходит. RaiseLastOSError = "A call to an OS function failed".
Может кто-нибудь знает в чем проблема?
PM MAIL WWW   Вверх
aktuba
Дата 2.5.2007, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


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

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



А для чего подобное извращение??? Если сильно надо - выложи какой-нибудь тестовый проект...


--------------------
user posted image
PM MAIL WWW Skype   Вверх
bazzzman
Дата 2.5.2007, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



На генерацию меню уходит какое-то время (читаю файлы и папки с диска). 

В главном потоке стоит callback для WH_LL_KEYBOARD, и при показе popup из главного потока есть лаги (подвисание программы и задержка в обработке callback'е). Даже задержка в 0.5 сек. при генерации меню видна.

Хочу вынести все в отдельный поток, чтобы не задерживать очередь.

Проект в атаче.

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  popup.zip 2,22 Kb
PM MAIL WWW   Вверх
Snowy
Дата 2.5.2007, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



1. Для работы в другом треде тебе нужно винапишное окно. Можно невидимое.
2. Никакого Application.ProcessMessages в треде!
PM MAIL   Вверх
Snowy
Дата 2.5.2007, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Вот собрал пример на коленке:
Код

type
  TForm1 = class(TForm)
    Button1: TButton;
    PopupMenu1: TPopupMenu;
    procedure Button1Click(Sender: TObject);
  private
    FtWnd: HWND;
    procedure FtWndProc(var Msg: TMessage);
  end;

var Form1: TForm1;

implementation

{$R *.dfm}

procedure TrayThreadProc; StdCall;
begin
  with Form1 do
  begin
    FtWnd := AllocateHWnd(FtWndProc);
    SetForegroundWindow(FtWnd);
    TrackPopupMenu(PopupMenu1.Handle, 0, Mouse.CursorPos.X, Mouse.CursorPos.Y, 0, FtWnd, nil);
    DeallocateHWnd(FtWnd);
  end;
end;

procedure TForm1.FtWndProc(var Msg: TMessage);
begin
  with Msg do
    Result := DefWindowProc(FtWnd, Msg, wParam, lParam);
end;

procedure TForm1.Button1Click(Sender: TObject);
var Dummy: Cardinal;
begin
 PopupMenu1.Items.Add(NewItem('123', 0, false, true, nil, 0, 'na'));
 CreateThread(nil,0,@TrayThreadProc,nil,0,Dummy);
end;

PM MAIL   Вверх
bazzzman
  Дата 3.5.2007, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Snowy, спасибо. Проблема решена  smile 

Собственно вот этого не знал:
Цитата(Snowy @  2.5.2007,  12:29 Найти цитируемый пост)
1. Для работы в другом треде тебе нужно винапишное окно. Можно невидимое.
2. Никакого Application.ProcessMessages в треде!


Буду искать информацию на эту тему.
PM MAIL WWW   Вверх
Snowy
Дата 3.5.2007, 01:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Просто VCL всегда работает только в основном треде.
Хочешь вторичные - нужны независимы функции. Если окно,то неVCL окно. VCL не может работать во вторичном треде - только в основном.
Ну а Application - это всега базовый тред. Нельзя его трогать во вторичном.
Вобщем VCL - это всега базовый тред. И при мультитреде всегда нужно трогать его очень осторожно, а лучше вообще не трогать.
PM MAIL   Вверх
bazzzman
Дата 3.5.2007, 05:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Понял, спасибо большое.  smile 
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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