Показать сообщение отдельно
  #1  
Старый 04.09.2014, 16:22
delphi_begin delphi_begin вне форума
Прохожий
 
Регистрация: 23.09.2011
Сообщения: 22
Репутация: 10
По умолчанию Два параллельных потока

Приветствую, господа!

Стоит такая задача: Записать содержимое таблицы в две сторонние БД.
Эту задачу необходимо выполнять параллельно - запись в каждую БД в отдельном потоке. Каждый из потоков использует разные компоненты доступа, чтобы не мешать друг другу.

Я написал код, который работает, однако как только запускается второй поток, первый становится на паузу и ждет, пока закончится второй. Мне же нужно, чтобы они отработали одновременно.
[Класс потока]
Код:
 Tload = class(TThread)
      IBDB:TIBDataBase; 
      search:TIBQuery;
      tsearch,treport:TIBTransaction;
      import_pre:TIBDataset;
      import_delete,pre_delete:TIBSQL;
      memo:Tmemo; 
   public
    procedure Execute; override;
    procedure CreareSpec(db:string;memo:tmemo); //определяет в какую БД пишем, и в какой компонент выводим логи
  
  end;
Процедура procedure CreareSpec(db:string;memo:tmemo);
//тут я динамически создаю компоненты, и их свойста для объекта потока
Код:
self.memo:=memo;
IBDB:=tibdatabase.Create(form1);
ibDB.DatabaseName:=db;
и т.д.
Процедура Execute
Код:
 procedure Tload.Execute;
var f:textfile;
begin
   inherited;
assignfile(f,'c:\'+memo.Name+'.txt');
rewrite(f);
memo.Clear;
try
тут я открываю набор данных из одной базы и вставляю их в другую базу циклом while not eof
каждая операция в цикле записывается в текстовый файл
каждая пятитысячная операция (i mod 5000=0) выводится в соотвествующий memo. У каждого объекта потока он точно будет разный.
в конце terminate

В коде программы
объявляю две переменные типа TLoad
A1,A2:Tload;

и вешаю на две кнопки запуск двух процессов
первая кнопка
Код:
if ibdb.Connected=false then ibdb.Open;
A1:=Tload.Create(true);
A1.Priority:=tpNormal;
A1.FreeOnTerminate:=true;
A1.CreareSpec(db_path1,memo3);
A1.Execute;
и вторая кнопка
Код:
if ibdb.Connected=false then ibdb.Open;
A2:=Tload.Create(true);
A2.Priority:=tpNormal;
A2.FreeOnTerminate:=true;
A2.CreareSpec(db_path2,memo3);
A2.Execute;

Как я уже говорил, как только я запускаю второй поток, первый становится на паузу. Я почитал литературу, но так и не нашел ответа. Буду рад Вашей помощи.

Админ: 2-х дневный бан за несоблюдение правил форума по оформлению кода.
Ответить с цитированием