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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ShellExecute(...), помогите решить проблему 
:(
    Опции темы
Gnusss
  Дата 9.1.2006, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Привет всем!

Столкнулся с такой проблемой:
У себя в программе использую ShellExecute для запуска и открытия разных мест в том числе и сетевых ресурсов, и вот иногда когда этот ресурс например не доступен программа зависает т.к. ждет пока ShellExecute завершит свою работу.

ShellExecute вызываю вот так:
Код

ShellExecute(0,'open',URL,nil,NIL,SW_SHOWNORMAL);


Можно ли сделать так чтобы после вызова ShellExecute программа продолжала дальше работать, не дожидаясь пока она закончит работать.

Заранее спасибо за ответ!
PM MAIL   Вверх
FRAGNATIC
Дата 9.1.2006, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


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

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



Gnusss
в отдельном потоке вызывай=)
PM MAIL   Вверх
Гость_Gnusss
Дата 9.1.2006, 16:27 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











FRAGNATIC, это не выход.
Представим такую ситуаци:
Ползовател жмет на ссылку, запускаетс поток, но далше ползовател ничего не видет т.к ссылка не доступная. он нажимает еще раз, запускается еще одит поток, и так продолжается раз по 5 на кардую недоступную ссылку. И представь сколько в конце для в приложении будет потоков?
  Вверх
Alexeis
Дата 9.1.2006, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



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


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

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

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


Эксперт
***


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

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



Цитата(Гость_Gnusss @ 9.1.2006, 17:27 Найти цитируемый пост)

это не выход.


Ну почему не выход?
Воспользуйся либо ShellExecuteEx, которая может возвращать HProcess, либо CreateProcess.
Синхронизировать с основным потоком и известить пользователя - дело техники.


--------------------
    
PM MAIL ICQ Skype   Вверх
Poseidon
Дата 9.1.2006, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Цитата(Гость_Gnusss @ 9.1.2006, 15:27 Найти цитируемый пост)

Ползовател жмет на ссылку, запускаетс поток, но далше ползовател ничего не видет т.к ссылка не доступная. он нажимает еще раз, запускается еще одит поток, и так продолжается раз по 5 на кардую недоступную ссылку.
Так блокируй ссылку установив Enable:= False;



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Alexeis
Дата 9.1.2006, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Вариант с HProcess неплохой только вот что не возникнет ли проблем с доступом к общей памяти двух процессов - програмного и системного - мютекс ведь не поставишь.


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

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

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


Бывалый
*


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

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



Ладно. Всем спасибо!
PM MAIL   Вверх
Gnusss
Дата 9.1.2006, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



В общем, решил использовать потоки. И быстренько написал маленький модуль:
Код

unit LinkThreadUnit;

interface

uses
  Classes, ShellApi, Windows;

type
  TLinkThread = class(TThread)
  private
    fLink: pChar;
  protected
    procedure Execute; override;
  public
    Constructor Create(CreateSuspended: Boolean;ALink: String);
  end;

 procedure NTRunLink(Link: String);

implementation

{ TLinkThread }

Constructor TLinkThread.Create(CreateSuspended: Boolean; ALink: String);
begin
 inherited Create(CreateSuspended);
 fLink:= pChar(ALink);
 FreeOnTerminate:= True; 
end;

procedure TLinkThread.Execute;
begin
 ShellExecute(0,'Open',fLink,nil,nil,SW_SHOWNORMAL)
end;

{ Other Procedure }

procedure NTRunLink(Link: String);
begin
 TLinkThread.Create(False,Link);
end;

end.

Как по вашему нормально?
PM MAIL   Вверх
Alexeis
Дата 10.1.2006, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



NTRunLink должна возвращать хотя бы дескриртор потока чтоб затем
его можно было аварийно завершить.


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

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

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Гость_Gnusss
Дата 10.1.2006, 11:31 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











В моем случаи мне нужно толко открыть ссылку.
  Вверх
Alexeis
Дата 10.1.2006, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата

У себя в программе использую ShellExecute для запуска и открытия разных мест в том числе и сетевых ресурсов, и вот иногда когда этот ресурс например не доступен программа зависает т.к. ждет пока ShellExecute завершит свою работу.

Так вот чтобы не ждать зависший поток, а произвести аварийное завершение и нужно что-то возвращать.


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

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

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


Бывалый
*


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

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



Как я понял Windows прекращает работу ShellExecute, если в течении нескольких минут она не дала никаких резултатов(т.е ресурс по указанной ссыке не доступен).
PM MAIL   Вверх
mixan
Дата 20.1.2006, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А попробуй че-то типа этого:

Код

procedure TForm1. IdleApp( Sender: TObject; var done: Boolean);
begin
  //нужные действия при простое
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnIdle := IdleApp;
end;

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

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

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

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


 




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


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

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