CoInitalize(nil)

0

Zrobiłem zapisywanie do Excela, ale gdy stwierdziłem że za długo się to zapisuję postanowiłem przenieść to do wątku... No i zaczęły się schody - "Funkcja CoInitalize nie została wywołana". Próbowałem na rózne sposoby, w konstruktorze wywoływałem, i także poprzez Initalize. Co tu zrobic ? (Przed przeniesieniem do watku nie bylo problemow, wiec to raczej nie jest problem CoInitalize...)

Chyba ze trzeba utworzyc obiekty Excela przed wywolaniem watku i je przekazac jako parametry...

constructor ExportToExcel.Create(Zakres,AVG: Boolean; P_Out, P_Form, P_Szabl: string ; CreateSuspended : Boolean);
var
  I : Integer;
begin
  FreeOnTerminate := True;
  inherited Create(False);

  Excel_Formularz := CreateOleObject('Excel.Application');
  Excel_Szablon := CreateOleObject('Excel.Application');
  tmp := CreateOleObject('Excel.Application');

  Excel_Formularz.WorkBooks.Open(Path_Formularz);
  Excel_Szablon.WorkBooks.Open(Path_Szablon);
  tmp.WorkBooks.Open(Path_Formularz);

  CountSheet := Excel_Formularz.WorkBooks[1].WorkSheets.Count;
  CountRow := Excel_Szablon.Range['A65536'].End[3].Rows.Row;

  if(CountRow > 1) then
  begin
    SetLength(Arkusz,CountSheet);
    (...)
  end
    else
      Terminate;
end;
procedure ExportToExcel.Execute;
var
  I,J : Integer;
begin
  while not(Terminated) do
  begin
    for I := 0 to CountSheet - 1 do
    begin
      Excel_Formularz.Workbooks[1].WorkSheets[I+1].Name := Arkusz[I].Nazwa;
      for J := Arkusz[I].Start to Arkusz[I].Koniec do
      begin
        Col := Excel_Szablon.Cells[J,3];
        Row := Excel_Szablon.Cells[J,4];
        Wzor := UpperCase(Excel_Szablon.Cells[J,5]);
        Cell := Col + Row;
        Synchronize(Wartosc);
        Excel_Formularz.WorkBooks[1].WorkSheets[I+1].Range[Cell,Cell] := Wynik;
      end;
    end;
    if(FileExists(Path_Out)) then
    DeleteFile(Path_Out);
    Excel_Formularz.WorkBooks[1].SaveAs(Path_Out);
    Excel_Formularz.DisplayAlerts := False;
    Excel_Formularz.Quit;
    Excel_Szablon.DisplayAlerts := False;
    Excel_Szablon.Quit;
    tmp.DisplayAlerts := False;
    tmp.Quit;
    Terminate;

0

A próbowałeś CoInitialize, czy od razu założyłeś, że to nic nie da?

0

A na pewno ja wywolujesz w tym wlasnie watku ?

//------------- MSDN
CoInitializeEx Function
Initializes the COM library for use by the calling thread ....

0

Przeciez napisałem że wywoływałem. I nadal to samo.

A niech ktoś mi powie bo sprawdziłem inaczej: dałem po prostu Application.ProcessMessages (bez watku)
Więc czy warto wątek stosować, skoro efekt jest taki jaki zamierzałem [???]

0

Nie dziw się że pytają czy dałeś CoInitialize w wątku, bo w kodzie który wkleiłeś tego nie ma (moze napisz gdzie to wstawiles). Poza tym, jak zrozumiałem szukasz cennego czasu - pytanie co robi Synchronize(Wartosc) i czy musisz to robic na najglebszym etapie petli ? Caly zysk z watku idzie sie je..ac. poza tym po grzyba to while not terminated skoro to sie wykona tylko 1 raz ? Jak juz sprawdzasz to sprawdzaj w petli.

A co do Application.ProcessMessages - to dziwne ze efekt jest taki jak zamierzales. przecieŻ napisales ze dziala wolno a dodanie tego polecenia na bank dzialania nie przyspieszy. ProcessMessages, mówiąc krótko sprawi że aplikacja ci sie nie będzie przymulać w czasie długotrwałych operacji.

b

1 użytkowników online, w tym zalogowanych: 0, gości: 1