Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.05.12;
Скачать: [xml.tar.bz2];

Вниз

Проект из 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.006 c
1-34471
alexus
2003-04-29 13:55
2003.05.12
Глюки TImage?


1-34479
Елена
2003-04-17 00:13
2003.05.12
Редактор свойств


4-34655
ers
2003-03-10 14:27
2003.05.12
Как сделать прозрачным ListView?


3-34356
PrettyFly
2003-04-22 15:21
2003.05.12
Фильтрация + DBGrid


7-34625
beginner (!)
2003-03-16 15:30
2003.05.12
PropertySheet





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский