|
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;
|
|
|
|
|
Now i place code in .cpp file and all code give by you.Still i am getting error.
error C2039: 'GetRect' : is not a member of 'CTestDlg
|
|
|
|
|
Try the following :
0. Repair the state of your project (see your starting post)
1. Place the new context class at the top of your cpp, after the include block
2. Modify your OnClick function
3. Modify your ThreadLoop function
virtual void BeHappy() = 0;
|
|
|
|
|
Sorry it's not working for me.
But i want to say once again Thanks for Discussion.
|
|
|
|
|
Don't use a thread to do this use a timer.
|
|
|
|
|
OnNotify(HWND hDlg, int idCtrl, NMHDR *pnmh)
{
switch(pnmh->code)
{
case LVN_BEGINDRAG:
{
}
}
}
My code is like this
even after the dragging column of ListView i m not able catch the drag event inside case LVN_BEGINDRAG
am i missing something??
thanks in advance
|
|
|
|
|
Hello world,
I don't have any idea how do to make connection to a database using the language C. I preserve if it would be to SQL server.
Thanks
|
|
|
|
|
You may use, for instance ODBC , there are a lot of articles, here at CodeProject , in the database section [^].
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]
|
|
|
|
|
If you are using mysql then just have a look with the APIs provided by mysql
[^]
Величие не Бога может быть недооценена.
|
|
|
|
|
Take a look at documentation for the CDatabase and CRecordset MFC classes.
I believe this will be the easiest for a beginner.
In particular look at the CDatabase::Open[^] method.
|
|
|
|
|
Hi
How could I write my xml document with indention By MSMXL6
Is there any way to cofigure this
a sample code my clear the case
regards
|
|
|
|