|
For yor case it works.
As a general rule it won't.
delete[] against an object, whose type has a destructor will call the 'vector deleting destructor', which will call the destructor for each element.
The problem is the number of elements.
When new[] is called on a type with a destructor:
1. malloc a block large enough to hold the reqested # of elements, the actual block size will be rounded up to some grain size.
2. store the actual block size (bytes) with the block for free().
3. store the requested # of elements with the block so delete[] can iterate over them and call ~().
When you call delete on a different (sized) type the # of elements stored with the block will be wrong and you will either call ~() on too few or too many elements.
If too few then you could have a memory leak if the destructor frees resources.
If too many then you corrupt the heap.
...cmk
The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.
- John Carmack
|
|
|
|
|
Yes if the destructor is not virtual, no if it is. Delete will take any type, but it will only call the appropriate destructor if it is virtual or if you pass it as the correct type.
|
|
|
|
|
dear all,
i have created one SDI application and i need to include one table (just like how we insert table into ms word document).
is it possible? if yes please let me know..
thanks in advance.
AK
|
|
|
|
|
Khathar wrote: is it possible? if yes please let me know..
Yes it's possible.
have a look at MFC Grid control 2.26[^].
Watched code never compiles.
|
|
|
|
|
|
Hello,
i try to write large text in to CComboBox field, but the max text length is limited by the CComboBox width !!!
But i need to imput larger text as the width of the combo box, when i write my text, the cursor moves to the right!!??
If i read large string from a file, this can be showed in the combo box, only if i try to write them by my self its limited!?
Can any one help me how to solve this??
Thanx for any help!
Arrin
|
|
|
|
|
Sorry
i solve this, its simple setting on the properties CBS_AUTOHSCROLL
Arrin
|
|
|
|
|
Hi All
I am useing worker thread in Dialog base Application.In Dialog I have a Static Control and Button.I try to set some values in Static Control.I have got some GUI Error application and CtlColor color change auto.As well as Control move from fixed position.I am doing like this
CWinThread *Testing;
UINT InsertThread ( LPVOID p );
UINT InsertThread ( LPVOID p )
{
CTestDlg *Get=( CTestDlg *)p;
Get->Example();
return 0;
}
void CTestDlg::OnBnClickedButton4()
{
Test = AfxBeginThread(InsertThread, (LPVOID) this,THREAD_PRIORITY_NORMAL,0,0);
}
void CTestDlg:: Example()
{
int count=0;
For(int i=0;i<10000;i++)
{
Count++;
CString show="";
show.Format("%d",count);
m_showvalues.SetWindowText(show);
}
}
I also use
OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) and OnEraseBkgnd(CDC* pDC) for change background color(Dialog and CtlColor).
How can i solve GUI Problem?
Please help me.
|
|
|
|
|
MsmVc wrote: How can i solve GUI Problem?
Never never access GUI elements in another thread than the GUI thread. This is a recipe for disaster. One way to solve your problem is instead to access the static control directly in your thread, you simply send a user defined message to your dialog. In the handler of this message, you update your control. This way, this is the UI thread that still accesses the control. More info and examples here[^]
|
|
|
|
|
MsmVc wrote: How can i solve GUI Problem?
You could pass the HDC and the client rectangle of the static control at your thread
to draw (only) there from the thread directly...
virtual void BeHappy() = 0;
|
|
|
|
|
can you give me some example?
|
|
|
|
|
If you would have taken the time to look at the article I linked to, you could see that there's an example in the section "Worker threads and the GUI II: Don't touch the GUI".
It's been a while that you are posting questions about threads and you still miss some basic concepts. Don't you think it could be interesting for you to read some good article (like the one I linked to you) about the subject ? Otherwise, you'll come asking questions here again and again and never really learn how to do it the proper way.
|
|
|
|
|
Try it :
class CCtrlDrawContext
{
CClientDC* m_pcCtrlDC;
CRect m_cCtrlRect;
public:
CCtrlDrawContext(CClientDC* pcDC, const CRect& cRect);
~CCtrlDrawContext();
const CRect& GetRect() { return m_cCtrlRect; };
CDC* GetDC() { return m_pcCtrlDC; };
};
CCtrlDrawContext::CCtrlDrawContext(CClientDC* pcDC, const CRect& cRect)
: m_pcCtrlDC(pcDC), m_cCtrlRect(cRect)
{
}
CCtrlDrawContext::~CCtrlDrawContext()
{
delete m_pcCtrlDC;
m_pcCtrlDC = NULL;
}
...
void CYourDialog::OnButtonClick()
{
CRect cStaticRect;
m_cwndStatic.GetClientRect(cStaticRect);
AfxBeginThread((AFX_THREADPROC) ThreadLoop,
new CCtrlDrawContext(new CClientDC(&m_cwndStatic),
cStaticRect));
}
UINT CYourDialog::ThreadLoop(LPVOID lpParam)
{
if (lpParam) {
CCtrlDrawContext* pcContext = (CCtrlDrawContext*) lpParam;
for (int i = 0; i < 10; ++) {
pcContext->GetDC()->FillSolidRect(pcContext->GetRect(),
i % 2 ?
RGB(0, 200, 128) :
RGB(0, 255, 0));
::GdiFlush();
::Sleep(500);
}
delete pcContext;
pcContext = NULL;
}
}
virtual void BeHappy() = 0;
modified on Friday, April 16, 2010 6:22 AM
|
|
|
|
|
An improvement: place ::GdiFlush();
after the drawing step in your loop
virtual void BeHappy() = 0;
|
|
|
|
|
As I said in my previous reply, never touch a UI control in outside of its own thread. This will result in a disaster.
|
|
|
|
|
I am not sure
that I understand your word "touch" -
see the code above - it is working
virtual void BeHappy() = 0;
|
|
|
|
|
By touch I mean manipulating any UI related element.
Eugen Podsypalnikov wrote: it is working
Did you test it ? If it works, you are lucky. But it is any way an extremly bad practice. I suggest you read the section "Worker threads and the GUI II: Don't touch the GUI" in the article I mentioned earlier to have a bit more information.
|
|
|
|
|
Cedric Moonen wrote: Did you test it ?
Not only me...
(The technique of the backgound updating is really wide-used today,
for example, when a main thread has other things to do... )
virtual void BeHappy() = 0;
|
|
|
|
|
IMHO he didn't really touch the GUI, i.e. there are no notifications to controls in his code.
Uhm...After second sight, I think there are...(but I suppose you may remove them).
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.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
Thanks for example....
I want to know about this line.
CCtrlDrawContext(CClientDC* pcDC, const CRect& cRect);
Can i pass these two parameter manual?i cann't understand example which is given by you?Please explain more details.
|
|
|
|
|
MsmVc wrote: Can i pass these two parameter manual?
Yes, for example,
as it shown in the function void CYourDialog::OnButtonClick()
virtual void BeHappy() = 0;
|
|
|
|
|
Sorry i am not geting what you want to tell me.
I think this part is header file.
class CCtrlDrawContext
{
CClientDC* m_pcCtrlDC;
CRect m_cCtrlRect;
public:
CCtrlDrawContext(CClientDC* pcDC, const CRect& cRect);
~CCtrlDrawContext();
cons CRect& GetRect() { return cRect; };
CDC* GetDC() { return m_pcCtrlDC; };
};
Now my code is
class CTestDlg : public CDialog
{
public:
CTestDlg(CWnd* pParent = NULL);
How can i pass this parameter
CClientDC* pcDC, const CRect& cRect
Please help me
|
|
|
|
|
For example :
void CYourDialog::OnButton4Click()
{
CRect cStaticRect;
m_cwndStatic.GetClientRect(cStaticRect);
AfxBeginThread((AFX_THREADPROC) ThreadLoop,
new CCtrlDrawContext(new CClientDC(&m_cwndStatic),
cStaticRect));
}
virtual void BeHappy() = 0;
|
|
|
|
|
i add your code but error show here
parnew CCtrlDrawContext(new CClientDC(&m_cwndStatic), cStaticRect));
Error
error C2661: 'CTestDlg::CTestDlg' : no overloaded function takes 2 arguments
|
|
|
|
|
Please see your starting post -
you have to modify your void CTestDlg::OnBnClickedButton4()
(the Context class could be placed in the same *.cpp file,
but above the CTestDlg implementation)
virtual void BeHappy() = 0;
|
|
|
|