Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.12;
Скачать: CL | DM;

Вниз

Проект из D5 работает не правильно в !   Найти похожие ветки 

 
BorisUK ©   (2003-04-28 06:51) [0]

Делаю простую вещь... кручу прогрессбар в отдельном потоке пока юзер ждет выборку из базы.. В пятерке все работает (проверил) а в седьмой версии получается, как будто поток вовсе и не поток... тоесть все подвисает пока данные получаются из базы... Значение position в прогресбаре перестает увеличиваться (тоесть поток приостанавливается) на момент выполнения запроса.... В чем дело не пойму... Помогите разобраться... как добиться эффекта параллельной работы?


Данный простой пример работает как надо в Делфи 5, но не правильно в Делфи7

код потока:

unit SQLExecThread;

interface

uses
Classes, sysutils, Windows;

type
TSQLExecThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
procedure Monitor;

public

end;

implementation

uses Unit1;

var
i : Integer;

procedure TSQLExecThread.Monitor;
begin
Form1.Progress.Position:=i;
Form1.percent.Caption:=IntToStr(i)+"%"; {Label}
Form1.Refresh;
end;

procedure TSQLExecThread.Execute;
begin
i:=0;
while not (Terminated) do
begin
inc(i);
if i=100 then i:=1;
Synchronize(Monitor);
sleep(500);
end;

i:=100;
Synchronize(Monitor);
sleep(300);
end;

end.


запускаю так:
var
MyThread : TSQLExecThread;
...

procedure TForm1.Button1Click(Sender: TObject);
begin
MyThread := TSQLExecThread.Create(true);
MyThread.Resume;
MyThread.Priority:=tpNormal;
MyThread.FreeOnTerminate:=false;
end;


 
MBo ©   (2003-04-28 07:24) [1]

на первый взгляд выглядит нормально, однако в приведенном коде нет никакого взаимодействия с базой - в таком варианте все это можно делать и в основном потоке по таймеру.


 
BorisUK ©   (2003-04-28 07:48) [2]


> MBo © (28.04.03 07:24)

Я повторяю что это простой пример... и не из него идет взаимодействие с базой, а из основного потока... Проблема в том что этот код работае не правильно в делфи 7 ...
Тоесть делаем ...
//Запуск потока
MyThread := TSQLExecThread.Create(true);
MyThread.Resume;
MyThread.Priority:=tpNormal;
MyThread.FreeOnTerminate:=false;
// потом запуск запроса
Query1.Active:=true;
// Завершаем поток...
MyThread.Terminate;



...
В результате (в Д7) поток тормозится до момента окончания выборки данных....
в Д5 - работает параллельно... Pfgecnbnt Запустите этот пример на Д5 и на Д7 чтоб убедится... или может только у меня такая байга. Но в чем проблем то - не пойму....???


 
MBo ©   (2003-04-28 07:54) [3]

d7 уменя нет.
А может, в доп. потоке как раз запрос и выполнять?
Не знаю всей ситуации, но общие правила использования доп. потоков таковы - в них выполняются длительные вычисления, подключения и общение по сети и с БД, а вот интерфейсом должен заниматься основной поток.


 
BorisUK ©   (2003-04-28 08:10) [4]

Согласен. Но в данном случае такой необходимости нет!
Мне не надо чтобы данные запрашивались в параллельном потоке, а в это время юзер выполнял какие то действия в основном потоке... В моем случае запрос данных это ключевой момент программы и не дождавшись его окончания никакие действия не разрешены..
Единственное что я хочу сделать это показать юзеру визуализацию этого процесса... Что и реализованно на Д5 и прекрасно работает...
Вопрос все тотже - почему тот же код закгруженный в Д7 работает как попало???
Ответы пож по существу. Заранее спасибо!


 
Digitman ©   (2003-04-28 09:17) [5]

Концептуально такой подход вызывает серьезные нарекания.
Длительный и "тяжелый" запрос должен работать в доп.код.потоке, чтобы осн.код.поток в это же время мог оперативно реагировать на события/сообщения (в т.ч. - на CM_EXECPROC, посылаемое в методе Synchronize).
Если же требуется ограничить действия польз-ля на время выполнения запроса в доп.потоке, то это достаточно легко сделать, запретив фокус (либо скрыть) тех виз.элементов управления на форме (формах), доступ к которым со стороны польз-ля может нарушить корректный ход работы программы.
Полагаться же на одинаковую реализацию классов TThread и TQuery в Д5 и Д7 не следует


 
BorisUK ©   (2003-04-28 13:01) [6]

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

Но все называется выкрутился. На самом деле реальная фишка, что процесс не захотел работать в Д7, хотя успешно работал в Д5 (приведенный выше пример) - все это все ещё присутствует и надеюсь не вылезет гденибудь ещё, где нельзя будет уже выкрутится.... Может кто-нибудь всеже скажет как быть с такой ситуацией? И как нужно написать этот процесс в Д7, чтоб он всеже работал ...?


 
Digitman ©   (2003-04-28 13:08) [7]


> называется выкрутился


не "выкрутился", а - сделал как правильно, как положено, концептуально !


> как нужно написать этот процесс в Д7, чтоб он всеже работал


не процесс, а трэд
не путайся в терминологии : это разные термины и разные сущности

здесь только одна рекомендация - иметь всегда под рукой док-цию по API и док-цию/исходники для тех классов, который обращаются к данным API и которые ты используешь у себя в приложении.


 
ErikIvanov   (2003-04-28 13:33) [8]

У меня возникли похожие проблеммы только в D6. В Delphi 5 все работало нормально а в D6 регулярно получаю
EThread: Thread Error: The parameter is incorrect (87)
Frame at $00B6F5A0 (type: efkFinally)
Code at $00428DD9
Module "Classes", Procedure "TThread.CheckThreadError", Unit "", Line 0
Что делать?
Код мне досталься с Delphi 3 и я его подерживаю. Периписать все нереально.


 
Anatoly Podgoretsky ©   (2003-04-28 13:43) [9]

ErikIvanov (28.04.03 13:33)
Раз код не переписывается, то зачем его запускать в Д6, он должен оставаться и поддерживаться в Д3, если ты конечно не враг себе.


 
ErikIvanov   (2003-04-28 14:27) [10]

Я его перетащил в D5 и он работал. Много чего переписал, но все сразу НЕМОГУ!!!! А развиватся надо, есть компоненты только для D6 и исправлений для Midas в 6 много. Я туда добовляю подержку Midas.



Страницы: 1 вся ветка

Текущий архив: 2003.05.12;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.011 c
11-34386
Igit
2002-08-11 08:25
2003.05.12
Таймер


14-34611
Songoku
2003-04-19 16:04
2003.05.12
Кто за то что бы провести соревнования по DELPHI????


3-34347
Chery
2003-04-22 13:44
2003.05.12
Догрузка данных из архива в текущую БД


8-34513
antonn
2003-02-01 09:54
2003.05.12
dsound.dcu not found


4-34645
wadimwlad
2003-03-12 07:39
2003.05.12
WinApi