powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Поток и timer
23 сообщений из 48, страница 2 из 2
Поток и timer
    #39893747
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, гугл на первой странице поиска по запросу "delphi tthread" выдаёт один треш. Не удивительно, что у новичков такие проблемы с этой темой :)
...
Рейтинг: 0 / 0
Поток и timer
    #39893749
LMag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что именно не так делаю, не могли бы посказать
...
Рейтинг: 0 / 0
Поток и timer
    #39893768
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LMag,

1) Создавайте в потоке не только TpFIBQuery и TpFIBTransaction, но и TpFIBDatabase.
2) Не используйте ShowMessage в потоке.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
interface
TThreadDM = class(TDataModule)
  FDb: TpFIBDatabase;
  FTran: TpFIBTransaction;
  FQry: TpFIBQuery;
  procedure ThreadDataModuleCreate(Sender: TObject);
  procedure ThreadDataModuleDestroy(Sender: TObject);
private
  { Private declarations }
public
  { Public declarations }
end;

TCountOperOrdersThread = class(TThread)
  FDM: TThreadDM;
  private
  protected
    procedure Execute;override;
end;

implementation

{ TThreadDM }
procedure TThreadDM.ThreadDataModuleCreate(Sender: TObject);
  FDb.DBName := DM.FBase.GetDBPath;
  FDb.ConnectParams.UserName := DM.FBase.UserName;
  FDb.ConnectParams.Password := DM.FBase.Password;
  FDb.ConnectParams.CharSet := 'WIN1251';
  try
    FDb.Open;
    FTran.StartTransaction;
  except
    // ToLog(); >>>!!!!!
  end;
end;

procedure TThreadDM.GDThreadDataModuleDestroy(Sender: TObject);
begin
  FTran.Commit;
  FDb.Close;
end;

{ TCountOperOrdersThread }
procedure TCountOperOrdersThread.Execute;
begin
  FDM := TThreadDM.Create(Application);
  try
    if Terminated or not FDM.FDb.Connected then
      Exit;

    FQry.ExecQuery;

  finally
    FDM.Free;
  end;
end;


...
Рейтинг: 0 / 0
Поток и timer
    #39893773
LMag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45,

Спасибо Вам , сейчас попробую... сделать...
...
Рейтинг: 0 / 0
Поток и timer
    #39893801
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeM
не учите

Ни в коем разе! Это вообще занятие неблагодарное))
Bred eFeMплохому

Где написано, что это плохо?
Bred eFeMЕсли "готовый функционал windows", то это CreateThread. Вот и покажите пример с его применением для Delphi и c сообщениями/событиями для взаимодействия.Зачем? Для чего городить огород на ровном месте?
...
Рейтинг: 0 / 0
Поток и timer
    #39893802
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LMag
Теперь у меня программа при выполнения данного потока зависает...
убираю FQuery, программа нормально работает...
Возможно из-за этого:
Dimitry Sibiryakov

до сериализации вызовов Firebird API в пределах одного коннекта
клиентской библиотекой.
Т.е. если пользуешься коннектом из главного потока во вторичном, то выполнятся запросы будут в любом случае последовательно и, следовательно, параллелиться ничего не будет.
...
Рейтинг: 0 / 0
Поток и timer
    #39893841
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Воспользуйтесь таким псевдокодом:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    btnStartMyThread: TButton;
    procedure btnStartMyThreadClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TMyThread = class(TThread)
  private
    FCount: Integer;
    procedure UpdateLabel;
  protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnStartMyThreadClick(Sender: TObject);
begin
  // Запускаем поток. Ничего не ждём.
  TMyThread.Create(False);
end;

{ TMyThread }


procedure TMyThread.Execute;
var
  fdb: TpFIBDatabase;
  tran: TpFIBTransaction;
  q: TpFIBQuery;
begin
  FreeOnTerminate := True; // Объект потока уничтожится самостоятельно

  fdb := TpFIBDatabase.Create(...);
  tran := TpFIBTransaction.Create(...);
  q := TpFIBQuery.Create(...);
  try
    // 1. Настроить подключение к БД
    // 2. Настроить параметры транзакции
    // 3. Настроить запрос

    q.ExecQuery; // 4. Выполнить запрос

    // 5. Получаем результат выполнения запроса и сохраняем в поле FCount
    FCount := q.RecordCount;

    // 6. С помощью Syncronize обновляем элемент на форме
    Syncronize(UpdateLabel);
  finally
    q.Free;
    tran.Free;
    fdb.Free;
  end;
end;

procedure TMyThread.UpdateLabel;
begin
  Form1.Label1.Caption := IntToStr(FCount);
end;

end.



Только программу не закрывайте, пока доп. поток работает, иначе AV ловить будете.
...
Рейтинг: 0 / 0
Поток и timer
    #39894066
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
Код: pascal
1.
2.
3.
4.
    q.ExecQuery; // 4. Выполнить запрос

    // 5. Получаем результат выполнения запроса и сохраняем в поле FCount
    FCount := q.RecordCount;

А не проще выполнить
Код: sql
1.
SELECT COUNT(*)...

?
...
Рейтинг: 0 / 0
Поток и timer
    #39894075
LMag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

Что вы имеете ввиду под дополнительным потоком? Основную программу...
...
Рейтинг: 0 / 0
Поток и timer
    #39894105
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
А не проще выполнить
Код: sql
1.
SELECT COUNT(*)...

?


Тут что угодно может быть. Не суть.
...
Рейтинг: 0 / 0
Поток и timer
    #39894111
vvvait
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Т.к. процедура коннекта может быть длительной, поток лучше запустить 1 раз и управлять им через события, 0 - запрос кол-ва, 1 - закрытие приложения, так же запрос будет выполнятся по таймауту, это вместо таймера.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
procedure TCntThread.Execute;
var SEA:TWOHandleArray;
begin
  
  SEA[0]:=Owner.SignalEvent.Handle;
  SEA[1]:=Owner.TerminateEvent.Handle;
  
  //...создание объектов и коннект
  try
  while True
     do case WaitForMultipleObjects(2, @SEA, False, Timeout) of
          WAIT_TIMEOUT,
          WAIT_OBJECT_0 :
           // .. запрос кол-ва
          WAIT_OBJECT_0 + 1 :
            break;
          else 
           // .. обработка ошибок
        end;
  finally
  //.. освобождение ресурсов
  end
end

//при закрытии приложения выполнить:
TerminateEvent.SetEvent;
CntThread.WaitFor;
CntThread.Free;
...
Рейтинг: 0 / 0
Поток и timer
    #39894115
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vvvait

Код: pascal
1.
2.
3.
TerminateEvent.SetEvent;
CntThread.WaitFor;
CntThread.Free;

это лишнее, деструктор потока и так вызовет WaitFor
...
Рейтинг: 0 / 0
Поток и timer
    #39894141
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.к. процедура коннекта может быть длительной, поток лучше запустить 1 раз и управлять им через события, 0 - запрос кол-ва, 1 - закрытие приложения, так же запрос будет выполнятся по таймауту, это вместо таймера.



Ради бога, ну какие события? У автора не работают самые элементарные вещи!
...
Рейтинг: 0 / 0
Поток и timer
    #39895306
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
Кстати, гугл на первой странице поиска по запросу "delphi tthread" выдаёт один треш. Не удивительно, что у новичков такие проблемы с этой темой :)


Огромная статья по многопоточному программированию в Delphi. Материал оформлен очень грамотно. Жаль только, что старый (от 2000г).
...
Рейтинг: 0 / 0
Поток и timer
    #39895459
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
DmSer
Кстати, гугл на первой странице поиска по запросу "delphi tthread" выдаёт один треш. Не удивительно, что у новичков такие проблемы с этой темой :)


Огромная статья по многопоточному программированию в Delphi. Материал оформлен очень грамотно. Жаль только, что старый (от 2000г).
Какой-то ацкий винегрет!!!
ИМХО, лучше прочитать того же Пачеко.
...
Рейтинг: 0 / 0
Поток и timer
    #39895532
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какой-то ацкий винегрет!!!
ИМХО, лучше прочитать того же Пачеко.


Предлагаете советовать новичкам книгу, которая не продаётся уже 10-15 лет?
...
Рейтинг: 0 / 0
Поток и timer
    #39895550
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
Какой-то ацкий винегрет!!!
ИМХО, лучше прочитать того же Пачеко.


Предлагаете советовать новичкам книгу, которая не продаётся уже 10-15 лет?За это время в работе потоков ничего фундаментального не поменялось. В книге хорошо подан материал. Не вижу проблем.
...
Рейтинг: 0 / 0
Поток и timer
    #39895552
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно до кучи еще и Рихтера добавить.
Но, я так понимаю, у молодёжи сейчас чтение книг не в моде...
...
Рейтинг: 0 / 0
Поток и timer
    #39895574
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57
Предлагаете советовать новичкам книгу, которая не продаётся уже 10-15 лет?
За это время в работе потоков ничего фундаментального не поменялось. В книге хорошо подан материал. Не вижу проблем.

Где её брать? Качать с торрентов?
...
Рейтинг: 0 / 0
Поток и timer
    #39895584
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57
Но, я так понимаю, у молодёжи сейчас чтение книг не в моде...
А так же чтение хелпа и изучение демок...
...
Рейтинг: 0 / 0
Поток и timer
    #39895607
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
Barmaley57
пропущено...
За это время в работе потоков ничего фундаментального не поменялось. В книге хорошо подан материал. Не вижу проблем.


Где её брать? Качать с торрентов?
Да её где только нет! Тут главное желание. Если книга не продается, то это же не значит, что про нее надо забыть.
...
Рейтинг: 0 / 0
Поток и timer
    #39895620
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57
Можно до кучи еще и Рихтера добавить.
Но, я так понимаю, у молодёжи сейчас чтение книг не в моде...

организовать вебинар и с выражением читать Рихтера
...
Рейтинг: 0 / 0
Поток и timer
    #39895629
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barmaley57
Да её где только нет!


нашёл!
...
Рейтинг: 0 / 0
23 сообщений из 48, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Поток и timer
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]