Я пишу приложение delphi, которое взаимодействует с Excel. Одна вещь, которую я заметил, заключается в том, что если я вызываю метод Save для объекта книги Excel, он может зависать, потому что в Excel есть диалоговое окно, открытое для пользователя. Я использую позднюю привязку.
Я хотел бы, чтобы мое приложение могло замечать, когда сохранение занимает несколько секунд, а затем выполнять какое-то действие, например, показывать диалоговое окно, сообщающее, что именно происходит.
Я подумал, что это будет довольно просто. все, что мне нужно сделать, это создать поток, который вызывает Save, и заставить этот поток вызывать подпрограмму Excel Excel. если это займет слишком много времени, я могу принять меры.
procedure TOfficeConnect.Save;
var
Thread:TOfficeHangThread;
begin
// spin off as thread so we can control timeout
Thread:=TOfficeSaveThread.Create(m_vExcelWorkbook);
if WaitForSingleObject(Thread.Handle, 5 {s} * 1000 {ms/s})=WAIT_TIMEOUT then
begin
Thread.FreeOnTerminate:=true;
raise Exception.Create(_('The Office spreadsheet program seems to be busy.'));
end;
Thread.Free;
end;
TOfficeSaveThread = class(TThread)
private
{ Private declarations }
m_vExcelWorkbook:variant;
protected
procedure Execute; override;
procedure DoSave;
public
constructor Create(vExcelWorkbook:variant);
end;
{ TOfficeSaveThread }
constructor TOfficeSaveThread.Create(vExcelWorkbook:variant);
begin
inherited Create(true);
m_vExcelWorkbook:=vExcelWorkbook;
Resume;
end;
procedure TOfficeSaveThread.Execute;
begin
m_vExcelWorkbook.Save;
end;
Я понимаю, что эта проблема возникает из-за того, что объект OLE был создан из другого потока (абсолютно).
как я могу обойти эту проблему? скорее всего мне нужно будет как-то "перемаршалл" для этого звонка ...
Любые идеи?