MFC ablak frissítése callback közben

MFC ablak frissítése callback közben
2010-07-26T16:48:41+02:00
2010-07-28T09:02:16+02:00
2022-11-18T15:41:58+01:00
cerub
Hello

A következő problémámra keresek választ:

Adott egy MFC-s dialogus ablak amelyre felpakoltam egy progressbárt, továbbá egy dll, ami a munkát végzi. Pl. másol egy fájlt A-ból B-be.
Ki akarom jelezni, hogy a fájl másolás hol tart: a dll visszahivja az abalkot és paraméterben átadja, hogy éppen hol tart.
Ok, ezzel semmi gond, teljesen jól működik, szépen fut a csík az ablakon.
A probléma akkor kezdődik, amikor átváltok más alkalmazásra - majd vissza - miközben fut a másolás.
Ekkor kifehéredik az ablakom, a fejlécben pedig megjelenik, hogy "nem válaszol".
A visszahívott függvényemben az UpdateWindow-t használtam eredetileg, de kipróbáltam már a következőket is:

Invalidate
RedrawWindow
InvalidateRect
SetWindowPos
SendMessage(WM_PAINT)

Egyik sem orvosolta a problémámat. Szeretném, ha az ablak task-váltás után is frissülne.

Van valakinek valamilyen ötlete?

Köszi
Mutasd a teljes hozzászólást!
a dll visszahivja az abalkot és paraméterben átadja, hogy éppen hol tart.


A dll szamoljon kulon szalon, az ablaknak az ertekeket egy windows uzenettel add at!
Mutasd a teljes hozzászólást!

  • A dll sajnos nem az enyém, csak a visszahívandó függvény címét tudom megadni.
    A visszahívott függvényemben megpróbáltam, hogy egy windows üzenettel adjam át a paramétereket, de akkor is ugyanezt produkálta.
    Azt sajnos nem tudom, hogy hogyan lehetne rávenni a dll-t, hogy egy windows üzenetet küldjön.

    A külön szált nem lehet elkerülni?
    Mutasd a teljes hozzászólást!
  • Kulon szalat indithatsz magad is, amibol meghivod a dll fuggvenyet, majd a callback fuggvenyedbol uzenetet kuldesz.
    Mutasd a teljes hozzászólást!
  • A külön szált nem lehet elkerülni?


    Ha a fo szaladon inditod, akkor lefagyaszthatja a GUI-t, ez tortenik ebben az esetben is.
    Mutasd a teljes hozzászólást!
  • Köszönöm a válaszaidat, a te írásaidból és az egyéb felkutatott anyagokból is az derül ki számomra, hogy a több szál lenne az igazi megoldás.

    A kutakodások közben a kollégám talált rá erre a kódrészletre ami végül is megoldotta a problémámat (ő a Basicben használt DoEvents() szerű megoldást keresett):

    ************************************************************************************
    "Cathy" <cchiou@hotmail.com> wrote:
    >
    >How can I use "DoEvents" in C++ program?

    I borrowed the following from a sample Microsoft program (VTERM):


    void CMainFrame::DoEvents() { MSG msg; // Process existing messages in the application's message queue. // When the queue is empty, do clean up and return. while (::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE) && !m_bCancel) { if (!AfxGetThread()->PumpMessage()) return; } }
    EXCEPT THAT I put the DoEvents() in my CDialog class. A pointer to that instance
    of CDialog allowed me to access this (public) function as a doevents, similar
    to how I'd do it in VB. m_bCancel was a flag in my CDialog (also public)
    which I used to determine if the Cancel button of my dialog had been pressed
    while my program sorted, churned, and did other things.
    **************************************************************************************

    A visszahívott függvénybe beépítve végrehajtja a feltorlódott üzeneteket, majd folytatja
    munkáját és szépen kirajzol mindent amit kell.


    Még egyszer köszi.
    Mutasd a teljes hozzászólást!
  • A visszahívott függvénybe beépítve végrehajtja a feltorlódott üzeneteket


    Ez messze nem tokeletes, mert ha nem hivodik meg a callback n masodpercig, akkor a fo szalad n masodpercen at nem fog uzeneteket feldolgozni es lefagy az ablakod!
    Mutasd a teljes hozzászólást!
  • Légy szíves fejtsd ki bővebben, mert nem tudom lekövetni, hogy mire gondolsz.

    - Fut a progi, hívom a dll-t, jön callback és kijelzi, hogy az adott sor feldolgozása hol áll.
    - Fut a progi, hívom a dll-t, nem jön a callback, akkor mindenképpen meg kell várnom, amíg végez az adott sorral és léphetek a következőre. Ha külön szált kap, akkor sem tudom jelezni, hogy éppen hol áll.
    Vagy arra gondolsz, hogy ebben az esetben megint ki fog fehéredni az ablak és akkor frissül amikor a következő sora lép?

    Igazad van ez elképzelhető, de mivel már egy kész alkalmazásba kellet belenyúlnom &#8211; ha egy mód van rá nem szeretném átírni több szálra, ahhoz több idő kellene, legalábbis nekem - és magával a callback résszel idáig nem volt probléma, marad ez a megoldás.
    Mutasd a teljes hozzászólást!
  • Szóval, van egy nem tökéletes megoldás, ami jelenleg megoldja a problémámat és ez nekem most elég.

    A pontokat viszont neked adom, mert egyrészt segítségemre siettél, másrészt megadtad az alapelvet, amivel véglegesen meglehet oldani a problémát.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd