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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2010, 00:50   #1
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
Восклицание

Здравствуйте. Подскажите пожалуйста как можно обработать пару проблемок.

1. При удачном завершении потока должно закрываться окно StatusForm. Окно закрывается, но есть мелкая неприятность - если ничего не трогать, то после завершения окно висит, а как только на жать на любую клавишу или двинуть мышь, то тогда закрывается. Вот хотелось бы, чтобы эта ситуация устранилась.
Я так понимаю, что окно получает сообщение на закрытие и при следующем такте только начинает обрабатываться... Или я не так понимаю...

2. Нужно в случае прерывания потока так же закрывать окно StatusForm, но вот что-то никак не получается...

Проект прикрепил...

Я так понимаю, что тут в принципе нет ничего сложного, просто я в 1 раз с потоками работаю...
Вложения
Тип файла: rar Tags.rar (30.4 Кб, 16 просмотров)

Последний раз редактировалось Stilet; 26.02.2010 в 14:17.
Arkuz вне форума Ответить с цитированием
Старый 26.02.2010, 14:06   #2
BARNEY
Участник клуба
 
Регистрация: 23.04.2009
Сообщений: 1,058
По умолчанию

может стоит почитать про

Код:
try
except
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
BARNEY вне форума Ответить с цитированием
Старый 26.02.2010, 14:16   #3
InternetStranger
php / delphi
Форумчанин
 
Аватар для InternetStranger
 
Регистрация: 10.06.2007
Сообщений: 175
По умолчанию

Все-таки, в следующий раз лучше бы выложить код потока в тегах [code], чем прикреплять целый проект ( мало найдется желающих ковыряться в чужих исходниках ).

По сабжу: Ваша проблема возникает из-за того, что вы обращаетесь напрямую к VCL-компонентам из дополнительного потока (в данном случае к форме). Что категорически не рекомендуется, причем самой средой при создании модуля потока. (Из-за особенностей реализации VCL-библиотеки).

Перенесите код закрытия (условную конструкцию) внутрь синхронизируемого метода updpr. Это гарантирует, что метод будет выполнятся к контексте главного потока.

Причем Suspended:=false; оттуда придется убрать. Дополнительный поток не может сам себе скомандовать уснуть - это приведет к взаимоблокировке главного и дополнительного потоков ))
G.Azamat { Web Development / Computer simulation }
Начинающий программист думает, что в килобайте 1000 байтов, а законченный уверен, что в километре 1024 метра.
InternetStranger вне форума Ответить с цитированием
Старый 26.02.2010, 17:45   #4
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

Цитата:
Сообщение от InternetStranger Посмотреть сообщение
Все-таки, в следующий раз лучше бы выложить код потока в тегах [code], чем прикреплять целый проект ( мало найдется желающих ковыряться в чужих исходниках )
Да я специально прикрепил проект, чтобы понятно было где какое окно, что за поток, какие переменные и т.д.
А что касается преноса условной части... Сделал увы не помогло...
Цитата:
Сообщение от BARNEY
может стоит почитать про
Код:
try
except
Увы, эта конструкция тоже не отрабатывает так как хотелось бы...

Мне удалось сделать, чтобы окно получало сообщение о закрытии. Осталась проблема - независимо, удачно завершилась операция или была прервана пользователем, окно с прогрес баром висит пока не нажмёшь на кнопку или не пошевелишь мышью...

Для удобства: тексты потока и статус-формы:

Текст формы:

Код:
procedure TStatusForm.OkCancelBtnClick(Sender: TObject);
begin
 ren_thr.Suspend;
 if MessageBox(handle,'Прервать операцию','Внимание',mb_YesNo)=mrYes
  then
    begin
      ren_thr.Resume;
      ren_thr.Terminate;
    end
  else ren_thr.Resume;
end;

procedure TStatusForm.FormShow(Sender: TObject);
begin
 ren_thr:=RenameTread.Create(true);
 ren_thr.Resume;
 ren_thr.Priority:=tpLower;
end;
Текст потока:
Код:
procedure RenameTread.badexit;
begin
 if Terminated then
  begin
    StatusForm.Close;
    ren_thr.Destroy;
  end;
end;

procedure RenameTread.Execute;
var
 i:integer;
begin
 StatusForm.ProgressBar1.Max:=MainForm.ListBox1.Items.Count;
 ii:=0;
 for i:=0 to MainForm.ListBox1.Items.Count-1 do
   begin
     Synchronize(updpr);
     RenameFile(MainForm.ListBox1.Items.Strings[i],MainForm.TranslitName(MainForm.ExNameMp3(MainForm.ListBox1.Items.Strings[i])));
     ii:=i+1;
     Synchronize(updpr);
     badexit;
   end;
goodexit;
end;

procedure RenameTread.goodexit;
begin
 StatusForm.Close;
 ren_thr.Destroy;
end;

procedure RenameTread.updpr;
begin
 StatusForm.ProgressBar1.Position:=ii;
 StatusForm.Label1.Caption:=IntToStr(round(StatusForm.ProgressBar1.Position*100/StatusForm.ProgressBar1.Max))+'%';
end;

Последний раз редактировалось Arkuz; 26.02.2010 в 19:54.
Arkuz вне форума Ответить с цитированием
Старый 26.02.2010, 22:35   #5
Arkuz
Форумчанин
 
Аватар для Arkuz
 
Регистрация: 22.09.2007
Сообщений: 540
По умолчанию

В принципе нашёл выход из положения. На форму добавил лэйбл и использую его как статус, когда копируется, статус - выполняется, по завершении - завершено и пока что-нибудь не нажмёшь окошко висит и информирует...

Не было бы счастья, да несчастье помогло :-)
Arkuz вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с дочерней формой в DLL madmech Общие вопросы Delphi 3 09.06.2009 19:21
Проблема с формой пароля almus Microsoft Office Excel 7 01.10.2008 14:12
Проблема с реализацией потока InseR Общие вопросы Delphi 11 19.08.2008 12:20
Проблема с новой формой Ellita Общие вопросы Delphi 11 06.09.2007 17:14
Проблема с формой. Teen4jump Общие вопросы Delphi 2 07.08.2007 16:46