Wywołanie metody z głównego wątku przez wątek pomocniczy.

0

Witam.

Męczę się z aplikacją do wyświetlania pdf'ów, jako że informacja o tym jaki plik otworzyć ma przyjść z "zewnątrz" próbuje użyć metody LoadFile w BackgroundWorker.
Support Acrobat'a odpowiedział mi, że użycie metody LoadFile możliwe jest jedynie w głównym wątku...

Jest jakiś sposób aby z wątku pobocznego wywołać jakąś metodę w wątku głównym tak aby dana biblioteka widziała ją jako wywołaną w wątku głównym ?
Próbowałem banalnego rozwiązania (w nadziei, że się uda...):

  • na formę rzuciłem TextBoxa- w zdarzeniu TextChanged wsawiłem AxAcrobat.LoadFile(TextBox1.Text)
  • w BackgroudWork'erze nasłuchuję komunikatów z sieci - jeśli coś przyjdzie wstawiam to w TextBox'a
    jednak kończy się to wyjątkiem spowodowanym wywołaniem LoadFile przez wątek inny niż głowny....
0

cos namieszales, daj kod :)
nie znam tej biblioteki ale na zdrowy rozsadek to bardzo malo prawdopodobne wymaganie aby ladowanie pliku musialo byc z watku UI

1

Mi sie wydaje, ze wolanie metody LoadFile nie tyle musi byc w glownym watku, co w tym samym watku, gdize tworzysz sobie te acrobatowe obiekty

0

musisz użyć Invoke(action) żeby wywołać na głównym wątku

0

Mam coś takiego:

public partial class Form1 : Form
{
    private TcpListener listener = null;
    private TcpClient externalClient = null;// imitacja klienta

    public Form1()
    {
        InitializeComponent();

        listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 1024); 
        externalClient = new TcpClient(); 
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        listener.Start();
        externalClient.Connect("127.0.0.1", 1024); 
        TcpClient newClient = listener.AcceptTcpClient(); 

        BinaryWriter writer = new BinaryWriter(externalClient.GetStream()); 
        BinaryReader reader = new BinaryReader(newClient.GetStream()); 

        writer.Write("d:\\test.pdf");

        axAcroPDF1.LoadFile(reader.ReadString());
    }
}

Oczywiście w BackgroundWorker będzie co innego (nasłuchiwanie komunikatów z sieci).

Uruchomienie BackgroundWorker'a spowoduje wyjątek:

Nie można rzutować obiektu modelu COM typu 'System.__ComObject' na typ interfejsu 'AcroPDFLib.IAcroAXDocShim'. Ta operacja nie powiodła się, ponieważ wywołanie metody QueryInterface dla składnika modelu COM w celu uzyskania interfejsu o identyfikatorze IID '{3B813CE7-7C10-4F84-AD06-9DF76D97A9AA}' nie powiodło się z powodu następującego błędu: Taki interfejs nie jest obsługiwany. (Wyjątek od HRESULT: 0x80004002 (E_NOINTERFACE)).

Komentarz support'u Adobe:

You can only call it from the main thread.

EDIT:
Kontrolka axAcroPDF1 była wrzucona na formę.

0

A gdzie deklarujesz axAcroPDF1?

0

Witam,

Tak to się chyba nie da, jeśli już tak chcesz zrobić to wywołaj funkcję load na controlce adobe na wątku UI przez delegate

Pozdrawiam,

mr-owl

1

skoro juz uzywasz background workera to mozesz sobie darowac invoke i wywolac swoja

axAcroPDF1.LoadFile

w handlerze do BackgroundWorker.RunWorkerCompleted

 ktore bedzie na wlasciwym watku
0

@katelx mogę Cię prosić o jakieś szersze wyjaśnienie bo szczerze mówiąc nie mam pojęcia jak zrobić to o czym mówisz...

Udało mi się coś zrobić :D !
W zdarzeniu RunWorkerCompleted obsługuję AxAcroPDF i ponowie uruchamiam nasłuchiwanie - nie wiem czy to @katlex miałaś na myśli ale tak zrozumiałem ;)

0

tak, to wlasnie mialam na mysli - zdarzenie o ktorym mowa, jest wywolywane na watku UI przez co biblioteka ktorej uzywasz nie powinna sie juz burzyc

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