|
I resolved the problem partially.
I put a Grid->RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_FRAME);
into the EraseBackground Handler.
But it's not the reason of the problem.
If i put the view directly into a frame( not into a TabWnd of another view ) it works also without errors.
|
|
|
|
|
Hello,
Is it safe to use:
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap *m_pOld = memDC.SelectObject(&some_bitmap1);
memDC.SelectObject(&some_bitmap2);
memDC.SelectObject(&some_bitmap3);
memDC.SelectObject(&some_bitmap4);
....
memDC.SelectObject(m_pOld);
memDC.DeleteDC;
or I should use SelectObject(m_pOld)/DeleteDC() after each SelectObject(&some_bitmapX)??
|
|
|
|
|
PatrykDabrowski wrote: Is it safe to use:[...]
Yes.
PatrykDabrowski wrote: or I should use SelectObject(m_pOld)/DeleteDC() after each SelectObject(&some_bitmapX)??
No.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
Thanks
|
|
|
|
|
No it is not safe to use.It will cause memory leak in your application.
I think,II Option is better one.Use SelectObject(m_pOld)/DeleteDC() after each SelectObject(&some_bitmapX)??
priyank
|
|
|
|
|
I have already tried both versions. None of them reports memory leaks in VS2003 in Debug mode. But maybe those resources are not monitored by VS... That's why I'm askng
Thanks!
|
|
|
|
|
pri_skit wrote: No it is not safe to use
Its safe.. its nothing to do with leaks (if we delete the selected objects)
or simply we can do like this,
CDC dc;
dc.SaveDC();
dc.RestoreDC( -1 );
No need to worry about the old objects..
Do your Duty and Don't expect the Result
|
|
|
|
|
Yes, I delete some_bitmapX objects (when exiting the app as they are 'global').
What I care about is:
1) Performance
2) Avoid memory/resource leaks.
Is CDC::CreateCompatibleDC()/DeleteDC() slower comparing to CDC::SaveDC()/RestoreDC()??
Thanks for help.
|
|
|
|
|
|
CPallini wrote: Please revise the order of your list
so true !
|
|
|
|
|
I should put 1) && 2)...in fact as long as I dont have leaks, I care more about performance So the order is fine
|
|
|
|
|
|
I have written "as long as I dont have leaks, I care more about performance ";)...so my priority is to avoid memory leaks and then I optimize my code.
I assume that both solutions don't cause leaks so I would like to choose faster one. (I mean CDC::CreateCompatibleDC()/DeleteDC against CDC::SaveCD()/RestoreDC() )
|
|
|
|
|
PatrykDabrowski wrote: I have written "as long as I dont have leaks, I care more about performance ";)...so my priority is to avoid memory leaks and then I optimize my code.
ok for me then
|
|
|
|
|
PatrykDabrowski wrote: I delete some_bitmapX objects (when exiting the app as they are 'global').
If you are creating those object once and deleting at the end, then no problem.
PatrykDabrowski wrote: CreateCompatibleDC()/DeleteDC() slower comparing to CDC::SaveDC()/RestoreDC()??
These two set of APIs are different from each other.
That is, after creating a compatible DC, you have select the needed objects into the DC. At last the original object belong to the DC have to be selected (the object returned, at the first select object, note this appicable for that specific type of object).
DelectDC will delete the DC that you created.
But the SaveDC and RestoreDC is for making the DC to its original state, you need not worry about reselecting the original objects. see below;
CDC dc; dc.CreateCompatibleDC(..);
dc.SaveDC();
dc.SelectObject(bitmap1);
dc.SelectObject(bitmap2);
dc.RestoreDC( -1 );
dc.DeleteDC();
By doing so, you need not have to maintain the old objects returned.
Do your Duty and Don't expect the Result
|
|
|
|
|
|
Programm3r wrote: Please contact the application's support team for more information
so what ! haven't you ???
BTW, what a perfect situation for using a breakpoint, isn't it ?!
|
|
|
|
|
toxcct wrote: so what ! haven't you ???
I wrote the application. You tell me who I must call ??
toxcct wrote: BTW, what a perfect situation for using a breakpoint, isn't it ?!
I know where it happens, but a breakpoint doesn't tell me what the problem was after the specific funtion call. After the error occured, does it?
The only programmers that are better than C programmers are those who code in 1's and 0's.....
Programm3rBronze
My Blog: ^_^
|
|
|
|
|
Programm3r wrote: I wrote the application. You tell me who I must call ??
i was kidding you with the message Windows returned
Programm3r wrote: I know where it happens, but a breakpoint doesn't tell me what the problem was after the specific funtion call. After the error occured, does it?
putting a breakpoint won't tell you what's the problem, but it will put you highly on the way.
do you know using the watch window ? you can inspect the content of your variables at a time, watching if the are correctly set... THIS can help you guessing what's wrong.
|
|
|
|
|
toxcct wrote: i was kidding you with the message Windows returned
Sorry my bad ...
toxcct wrote: do you know using the watch window ?
Yes. I'll try it.
Thank you very much toxcct.
The only programmers that are better than C programmers are those who code in 1's and 0's.....
Programm3rBronze
My Blog: ^_^
|
|
|
|
|
What call stack says to you ?
|
|
|
|
|
prasad_som wrote: What call stack says to you ?
Just before the error:
> Win32ClibRFC.exe!CClibRFC32::rfcCall(char * szUname=0x00417960, char * szTag=0x00417968, char * lpFromDate=0x0041796c, char * lpToDate=0x0041797c, char * szDesc=0x0041798c) Line 262 C++
Win32ClibRFC.exe!wmain(int argc=1, wchar_t * * argv=0x009c5870) Line 281 C++
Win32ClibRFC.exe!__tmainCRTStartup() Line 583 + 0x19 bytes C
Win32ClibRFC.exe!wmainCRTStartup() Line 403 C
But afterwards ... nothing
The only programmers that are better than C programmers are those who code in 1's and 0's.....
Programm3rBronze
My Blog: ^_^
|
|
|
|
|
Programm3r wrote: Win32ClibRFC.exe!CClibRFC32::rfcCall(char * szUname=0x00417960, char * szTag=0x00417968, char *
Is there such function in your app ? Try putting break point there.
|
|
|
|
|
prasad_som wrote: Is there such function in your app ? Try putting break point there.
Yes,
int CClibRFC32::rfcCall(char* szUname, char* szTag, char* lpFromDate, char* lpToDate, char* szDesc)
But inside that function the error occurs at this point:
RFC_HANDLE handle;
RFC_FUNCTIONNAME functionname;
RFC_PARAMETER exporting[MAX_PARA];
RFC_PARAMETER importing[MAX_PARA];
RFC_TABLE tables[MAX_PARA];
rfc_char_t * exception_ptr;
RFC_PARAMETER changing[MAX_PARA];
rc = RfcCallReceiveEx(handle, functionname, exporting, importing, changing, tables, &exception_ptr);
The only programmers that are better than C programmers are those who code in 1's and 0's.....
Programm3rBronze
My Blog: ^_^
|
|
|
|
|
Programm3r wrote: rfc_char_t * exception_ptr;RFC_PARAMETER changing[MAX_PARA];rc = RfcCallReceiveEx(handle, functionname, exporting, importing, changing, tables, &exception_ptr);
Does RfcCallReceiveEx expects uninitialized RFC_HANDLE handle value, which is case here. Same is case with RFC_FUNCTIONNAME parameter.
|
|
|
|