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

Вниз

Не ожидать завершения процедуры.   Найти похожие ветки 

 
0?0   (2012-08-18 08:06) [0]

Здравствуйте !
Подскажите как запустить процедуру, которая долго работает и не дожидаться её завершения. Т.Е. есть процедура выводящая на печать какие то документы, её нужно запустить и продолжить работу в основном окне программы, а она пусть себе печатает.


 
AV ©   (2012-08-18 09:13) [1]

вынести в отдельный поток


 
Дельфист   (2012-08-18 09:15) [2]

Как печатать будешь? Сам или через отчет? Код в студию


 
Inovet ©   (2012-08-18 10:15) [3]

> [2] Дельфист   (18.08.12 09:15)
> Как печатать будешь? Сам или через отчет?

Это принципиально?


 
O?O   (2012-08-18 10:53) [4]

> AV ©   (18.08.12 09:13) [1]
> вынести в отдельный поток

Как это правильно сделать?

> Дельфист   (18.08.12 09:15) [2]
> Как печатать будешь? Сам или через отчет? Код в студию

поразному, иногда через COM-порт на чековый принтер, иногда создавая документ в EXCEL и печать из него, но я думаю так же как говорит Inovet, что разницы не должно быть.


 
O?O   (2012-08-18 11:06) [5]

Процедура выводящая на печать документы уже имеется, возникла проблема ожидания завершения печати. В этом случае для вынесения в отдельный поток нужно изменить параметры этой процедуры или вызывать её другой которая поместит её в отдельный поток, и как это сделать?


 
AV ©   (2012-08-18 11:58) [6]

проще всего создать новый модуль потока, описать там нужную процедуру, передать ей параметры, запустить поток.

Окончание потока скажет об окончании печати

см. Любая книжка по потокам
например
http://mbo88.narod.ru/ToC.html


 
O?O   (2012-08-18 19:25) [7]

Спасибо, буду пробывать.


 
O?O   (2012-08-22 10:44) [8]

Вроде всё получается, кроме одного.
Когда программа в потоке хочет создать OLE обьект
XL := CreateOleObject("Excel.Application");
происходит ошибка: "Небыл произведён вызов CoInitialize ...."

Собственно вопрос: в какой момент и как его делать?

В Созданном обьекте MyThread доступент CoInitializeEx, но не воспринимает никакие параметры, или я не то всё делаб


 
O?O   (2012-08-22 10:45) [9]

делаю.

Запутался чёта :(


 
Anatoly Podgoretsky ©   (2012-08-22 11:35) [10]


> Собственно вопрос: в какой момент и как его делать?

Перед использованием.


 
O?O   (2012-08-22 12:14) [11]

Создаю поток:

.....
 MyThread := TMyThread.Create(True);
 MyThread.Priority:=tpNormal;
 MyThread.FreeOnTerminate := true;
 MyThread.Resume;
 exit;
.....


Сам объект:

unit Unit_MyThread;
.....
type
 TMyThread = class(TThread)

 private
   { Private declarations }
 protected
   procedure Execute; override;
 end;
....
 procedure TMyThread.Execute;
 var XL: variant;
....
 begin
....
       XL := CreateOleObject("Excel.Application");
///////////   выполнение этой строки (CreateOleObject) делает ошибку
       XL.DisplayAlerts := false;
       XL.WorkBooks.Open(Path);
....


В форме вызывающей обьект MyTrhead ни CoInitialize ни CoInitializeEx вызвать неполучается
В обьекте MyThread вроде можно вызвать CoInitializeEx, но непонятно какие параметры ему передать, ничего не воспринимает ещё на уровне компиляции.

Может что специфическое в uses добавить, или ещё чего сделать?


 
O?O   (2012-08-22 12:17) [12]

ComObj в Uses имеется, вопрос именно в CoInitialize


 
icWasya ©   (2012-08-22 13:06) [13]

http://msdn.microsoft.com/en-us/library/windows/desktop/ms695279(v=vs.85).aspx


 
O?O   (2012-08-22 15:10) [14]

Пока поставил так

 CoInitializeEx(NIL, 0);


Вроде работает


 
O?O   (2012-08-23 08:26) [15]

VCL не использую, но вот этот вызов CoInitializeEx(NIL, 0); меня смущает, подскажите, грабли есть на которые пока не наступил?


 
Anatoly Podgoretsky ©   (2012-08-23 08:44) [16]

Можно и так, но некрасиво, лучше CoInitializeEx(NIL,COINIT_MULTITHREADED);


 
O?O   (2012-08-23 08:45) [17]

И ещё один момент, передача параметров в этот поток.
Сейчас я сделал глобальную переменную для стека:

....
type
....
 TMyStack = ^TMyStk;

 TMyStk = Record
   Next: TMyStack;
   Kod: int64;
 end;
....
var
....
MyStack: TMyStack;
....


Перед созданием потока в вызывающей процедуре добавляю в стек параметр:

....
var MyStk: TMyStack;
....
     new(MyStk);
     MyStk^.Next := MyStack;
     MyStk^.Kod := ....;
     MyStack := MyStk;
     MyThread := TMyThread.Create(True);
     MyThread.Priority:=tpNormal;
     MyThread.FreeOnTerminate := true;
     MyThread.Resume;


В потоке делаю так:

....
var MyStk: TMyStack;
     MyKod: int64;
....

 MyStk := MyStack;
 MyStack := MyStk^.Next;
 MyKod := MyStk^.Kod;
 Dispose(MyStk);
....
....


 
O?O   (2012-08-23 08:47) [18]

Может как нибудь подругому параметр передать?


 
O?O   (2012-08-23 08:52) [19]


> Anatoly Podgoretsky ©   (23.08.12 08:44) [16]
> Можно и так, но некрасиво, лучше CoInitializeEx(NIL,COINIT_MULTITHREADED);
>


Что нужно добавить в uses чтобы эта переменная воспринималась?


 
Dimka Maslov ©   (2012-08-23 09:08) [20]

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

type
 TNewThread = class (TThread)
 private
   FThreadParam: String; // Тип может быть любой
 protected
  procedure Execute; override;
 public
  constructor Create(AThreadParam: String; CreateSuspended: Boolean);
 end;

constructor TNewThread.Create(AThreadParam: String; CreateSuspended: Boolean);
begin
  FThreadParam := AThreadParam; // присвоили значение поля
  inherited Create(CreateSuspended);
end;

 procedure TNewThread.Execute;
 begin
   Спокойно пользуемся FThreadParam;
   Не забываем предупредить главную форму об окончании процесса
 end;


 
Anatoly Podgoretsky ©   (2012-08-23 09:10) [21]

> O?O  (23.08.2012 08:52:19)  [19]

А поиск в файлах не знаком?
Ведь все равно я по памяти не помню, но и проблемы не возникает


 
O?O   (2012-08-23 09:28) [22]


> Dimka Maslov ©   (23.08.12 09:08) [20]

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


 
O?O   (2012-08-24 07:33) [23]

Всем ,jkmijt спасибо за советы.
Всё работает, теперь всё ясно и прозрачно!


 
O?O   (2012-08-24 07:48) [24]

,jkmijt - большое :)



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

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

Наверх




Память: 0.52 MB
Время: 0.049 c
2-1338196726
leklerk
2012-05-28 13:18
2013.03.22
Не работает WinExec


15-1346241592
ТимоховД
2012-08-29 15:59
2013.03.22
Кто чем пользуется, если надо массовые замены делать?


2-1330876757
TSubject
2012-03-04 19:59
2013.03.22
Ошибка при выполнении запроса в Oracle


2-1330947283
Vyacheslav
2012-03-05 15:34
2013.03.22
Две формы: FormStyle=fsStayOnTop.. Form2 всегда выше Form1?


15-1333975733
MBo
2012-04-09 16:48
2013.03.22
Delphi XE. Окно Watch List.