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