Re: Visual studio C++ CLR - vyvolání grafické akce z callbacku
Jiří Nesvačil
nesvacil na posys.eu
Pátek Březen 4 20:00:18 CET 2022
GDI je jednovlaknove. Vy musite predat zpravu GDI prvku, aby se
prekreslilo, nemuzete z jineho vlakna/callbacku primo kreslit, menit GUI
prvky. Proto pouzijte BeginInvoke,
https://stackoverflow.com/questions/37885788/update-gui-using-c-clr-windows-forms
Pokud to budete volat casto tj. vicekrat nez se stihne vykreslit, tak to
je taky spatne.
Druhou moznost, kterou mate je dat timer a vyvolat prekresleni
nekolikrat za sekundu.
Jirka
Dne 04.03.2022 v 18:51 Jaroslav Buchta napsal(a):
> Podobne veci jsem resil primitivne poslanim zpravy oknu - nestaci to?
> To by melo jit univerzalne mezi vlakny pres post nebo snad i mezi
> procesy. Rezie asi velka uznavam.
> Asi existuji primo v systemu nejake mechanismy, jak provadet
> notifikace ale nikdy jsem to nepotreboval. Videl jsem ale uz i
> reseni, kdy vlakna komuikovala pres network i v ramci jedne aplikace :-D
>
> Dne 04.03.2022 v 18:43 Pavel Hudeček napsal(a):
>> Myslím, že to není ono.
>>
>> Jde o následující situaci:
>>
>> *void callbackFn(int dataCnt);**
>> **
>> **namespace pokus1 {**
>> ** ...**
>> ** public ref class MyForm : public System::Windows::Forms::Form**
>> ** {**
>> ** ...**
>> **// tady je form a všechny controly**
>> ** ...
>>
>> **// kliknutím na button se se odsud spouští ten proces na pozadí:**
>> ** startTest( ... callbackFn); // funkce z externí knihovny**
>> ****
>> **// je tu funkce na aktualizaci pictureboxu:**
>> ** public: void refreshImg(int dataIdx) {**
>> ** ...**
>> ** }**
>> ** }**
>> **}**
>> **// tady, mimo namespace projektu je callbackFn,
>> // jinak ji ta startTest nemůže použít**
>> **void callbackFn(int dataCnt) {**
>> **// tady by se měl zavolat refreshImg(dataCnt-1);
>> **}*
>>
>> PH
>>
>>
>> Dne 04.03.2022 v 16:52 Jiří Nesvačil napsal(a):
>>> Zdravim,
>>>
>>> hledejte BeginInvoke
>>>
>>> Nesvacil
>>>
>>> Dne 04.03.2022 v 16:32 Pavel Hudeček napsal(a):
>>>> Dobrý den všem,
>>>>
>>>> mějme program psaný ve VS jako CLR aplikaci v C++.
>>>> Program spustí funkci běžící na pozadí, která občas vyvolá callback
>>>> a tím oznamuje, že jsou k dispozici nová data. Pak by se měl
>>>> aktualizovat picturebox, případně objevit záznam v listboxu a vše
>>>> pokračuje dál.
>>>>
>>>> Jenže nemůžu přijít na to, jak z tý callback funkce, která není
>>>> součástí managed prostředí, vyvolat akci v managed prostředí.
>>>>
>>>> Teda funguje mi varianta, že callback nastaví nějakou globální
>>>> proměnnou a na tu periodicky kouká timer, ale to je takový poněkud
>>>> nepraktický, protože délka "občas" závisí na kvantových jevech a
>>>> může dosahovat 100 kHz, nebo taky půl hodiny.
>>>>
>>>> Nějaké návrhy, jak to dělat přímočařeji?
>>>>
>>>> Díky,
>>>> PH
>>>> _______________________________________________
>>>> HW-list mailing list - sponsored by www.HW.cz
>>>> Hw-list na list.hw.cz
>>>> http://list.hw.cz/mailman/listinfo/hw-list
>>> _______________________________________________
>>> HW-list mailing list - sponsored by www.HW.cz
>>> Hw-list na list.hw.cz
>>> http://list.hw.cz/mailman/listinfo/hw-list
>>
>>
>> _______________________________________________
>> HW-list mailing list - sponsored bywww.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>
>
>
> _______________________________________________
> HW-list mailing list - sponsored bywww.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20220304/d49da1c3/attachment.htm>
Další informace o konferenci Hw-list