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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.075 c
15-1334989775
TSubject
2012-04-21 10:29
2013.03.22
Кто работал с Java?


15-1348831991
dmi3
2012-09-28 15:33
2013.03.22
for..in..do


15-1352665803
Юрий
2012-11-12 00:30
2013.03.22
С днем рождения ! 12 ноября 2012 понедельник


15-1345581002
Юрий
2012-08-22 00:30
2013.03.22
С днем рождения ! 22 августа 2012 среда


8-1230712152
Программер
2008-12-31 11:29
2013.03.22
Как узнать кодек и разрешение видеофайла?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский