Форум: "Прочее";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];
ВнизDataSet и потоки. Найти похожие ветки
← →
Help_ (2007-08-23 15:14) [0]Здравствуйте!
Необходимо форму чтобы форма справочника, которая имеет на себе компоненты набора данных, работала в другом потоке, нежели основная форма.
Как это реализовать? С потоками только начал знакомится.
Может есть живые примеры и т. д.
Заранее благодарен за помощь.!
← →
oldman © (2007-08-23 15:20) [1]А зачем такой изврат?
Люди вызывают справочник при возникновении вопросов, чтобы почитать его и не трогать основной процесс, поскольку именно в нем и возник вопрос.
← →
Help_ (2007-08-23 15:26) [2]
> oldman © (23.08.07 15:20) [1]
Не ну это я так просто пример привел, ну например другой вариант:
Скажем не справочник а какая нить форма расчетов....
Типа нажали кнопочку и форма пошла работать с DataSet- ом, там считает себе минут пять например, а мы в это время также работаем со справочниками, да и вообще програмой необращая внимания на расчеты...
P.S.
Ток историю про два "Conenta" я уже слыхал... ;-)
← →
Игорь Шевченко © (2007-08-23 15:29) [3]
> Типа нажали кнопочку и форма пошла работать с DataSet- ом,
> там считает себе минут пять например, а мы в это время
> также работаем со справочниками, да и вообще програмой необращая
> внимания на расчеты...
И в чем проблема ?
Я делал clientDataSet, в который помещал данные в потоке, одновременно эти данные читал DbGrid, каждая операция добавления данных выполнялась через Synchronize, все довольны
← →
Help_ (2007-08-23 15:33) [4]
> Игорь Шевченко © (23.08.07 15:29) [3]
Да какбы эт на пальчиках посмотреть...
P.S.
Сори за наглость.. :-]
← →
Romkin © (2007-08-23 15:34) [5]Зачем нужна форма, вот в чем вопрос :)
← →
Игорь Шевченко © (2007-08-23 15:39) [6]Можно и на пальчиках:
type
TBirthdayThread = class(TThread)
private
FID: Integer;
FLastName: string;
FFirstName: string;
FSecondName: string;
FBirthday: TDateTime;
private
procedure AddMemberToBirthdayList;
procedure AfterFillCDS;
public
constructor Create;
procedure Execute; override;
end;
{ TBirthdayThread }
procedure TBirthdayThread.AddMemberToBirthdayList;
begin
dmMember.AddMemberToBirthdayList(FID, FLastName, FFirstName, FSecondName,
FBirthday);
end;
procedure TBirthdayThread.AfterFillCDS;
begin
with dmMember.cdsBirthday do
begin
DisableControls;
try
IndexName := "VIEWKEY";
First;
finally
EnableControls;
end;
end;
end;
constructor TBirthdayThread.Create;
begin
inherited Create (true);
FreeOnTerminate := true;
Resume;
end;
procedure TBirthdayThread.Execute;
var
Today: string;
begin
if not Terminated then
begin
dmMember.BirthdayThreadRunning := true;
Today := FormatDateTime("dd.mm", Now);
with dmMember.qMemberBirthday do
begin
Prepare;
Params[0].AsString := Today;
Open;
try
while not Eof and not Terminated do
begin
FID := FieldByName("MEMBER_ID").AsInteger;
FLastName := FieldByName("LAST_NAME").AsString;
FFirstName := FieldByName("FIRST_NAME").AsString;
FSecondName := FieldByName("SECOND_NAME").AsString;
FBirthday := FieldByName("BIRTHDAY").AsDateTime;
Synchronize(AddMemberToBirthdayList);
Next;
end;
finally
Close;
end;
Synchronize(AfterFillCDS);
end;
dmMember.BirthdayThreadRunning := false;
end;
end;
← →
Help_ (2007-08-23 15:41) [7]
> Romkin © (23.08.07 15:34) [5]
Ну скажем форма нужна для текущего отображения процесса расчетов. Или чтот вроде этого.
Адним словом проблема в том, что на одной из ворм моего проекта реализуются расчеты, примерно по 350 000 записям.
В програме реализованно Application.ProcessMessage; (Изв. если ошибся)
Когда я произвожу расчеты, я могу только перемещать форму, но выполнять какието другие действия, скажел полистать справочник не получается до тех пор пок расчет не завершится.
← →
Help_ (2007-08-23 15:44) [8]
> Игорь Шевченко © (23.08.07 15:39) [6]
Спасибо! Вот чеслово, что говарили не понял, как пример привели сразу дошло.
P.S.
Люблю жевые примеры.. Ещераз спасибо
> Игорь Шевченко
Но обсуждение не останавливается, хотелось бы послушать (почитать) еще мнения...
;-)
← →
Игорь Шевченко © (2007-08-23 15:45) [9]Тогда еще до кучи:
procedure TdmMember.AddMemberToBirthdayList(ID: Integer;
const LastName, FirstName, SecondName: string; Birthday: TDateTime);
begin
with cdsBirthday do
begin
Insert;
try
FieldByName("MEMBER_ID").AsInteger := ID;
FieldByName("LAST_NAME").AsString := LastName;
FieldByName("FIRST_NAME").AsString := FirstName;
FieldByName("SECOND_NAME").AsString := SecondName;
FieldByName("BIRTHDAY").AsDateTime := BirthDay;
Post;
except
Cancel;
end;
end;
end;
procedure TdmMember.DataModuleCreate(Sender: TObject);
begin
inherited;
MemberMapper := GetMapper;
cdsBirthday.CreateDataSet;
dmMember := Self; //Для запуска потока
if Options.RunBirthdayThread then
TBirthdayThread.Create;
end;
← →
Leonid Troyanovsky © (2007-08-23 15:54) [10]
> Help_ (23.08.07 15:41) [7]
> Когда я произвожу расчеты, я могу только перемещать форму,
> но выполнять какието другие действия, скажел полистать
> справочник не получается до тех пор пок расчет не завершится.
Потоки необязательны, особенно, если процессор один.
Проще сделать специальную форму для расчетов,
которая будет работать в то время, пока юзер неактивен.
Только расчеты надо производить такими блоками,
время исполнения которых не будет раздражать юзера.
--
Regards, LVT.
← →
Anatoly Podgoretsky © (2007-08-23 17:20) [11]Молчим про базу, молчим про средства доступа, может этого достаточно.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.042 c