|
First of all, you are not _really_ using CSingleLock correctly.
The point of CSingleLock is to basically aid in cleaning up your critical section if your code throws an exception, or returns take this:
fun()
{
CCriticalSection section;
section.lock()
.
.
.
if (ladeda)
return false;
section.unlock();
}
here, if the "if (ladeda)" condition was true and you returned, you would be left with a locked CS. - using it this way you have to remeber to unlcok the CS before you return, it makes it harder to use exceptions or to have multiple return points in a function. CSingleLock overcomes that by locking in the constructor and unlocking in the destuctor, so by declaring one on the stack, your CS will automatically be unlocked when that stack unwinds - where ever you may be.
You use CSingleLock to overcome the problem like this:
fun()
{
CCriticalSection section;
CSingleLock lock(§ion, TRUE).
.
.
if (ladeda)
return false;
// no need to unlock section, done by ~CSingleLock
}
In other words, remove the explicate calls to singleLock.Lock(); and singleLock.Unlock(); in your code, and change the decliaration to be CSingleLock singleLock(critSectionPosition, TRUE); - this causes the constructor to call Lock for you.
As for your actual problem, well, it depends on what type your critSectionPosition data member is... You haven't included that bit ) You have to pass a pointer to a CS (or any other sync object) to CSingleObject, the assert is telling you your what you are passing is not of type CSyncObject - ie your not passing a CCritcalSection* which dervices from CSyncObject.
If you put up the critSectionPosition data type, I should be able to tell you.
|
|
|
|
|
I defined critSectionPosition as a pointer and create the object with new in the CToto constructor. I also tried to create it in the stack and I get the same problem.
I define my CCriticalSection objects as members of CToto because I have a GetPosition and a SetPosition fonction so I need the same CCriticalSection object to lock the position variable which is accessed by those two function independentely.
I juste tried now replacing my CCriticalSection by CMutex and it is working...
I know that CMutex are not well suited for my case so I would really like to manage to do that with CCriticalSection.
Thanks for your time
|
|
|
|
|
Hmm, how very strange
One thing, the nasty casting to AFX_THREADPROC isn't really a good idea, change your function prototypes to be UINT ThreadProc(LPVOID) and then cast the void paramter to the correct type in the thread.
What platform are you using (as in VS.NET/VC6)?
Also, try in your SlowThread just calling critsection->Lock() (ie doing away with the CSingleLock class) what happens then?
|
|
|
|
|
Hi there,
I want to get handle to window of a running instance of an application whose HINSTANCE i have stored in my Win32 application.
How do i do that?
modified 21-Apr-21 21:01pm.
|
|
|
|
|
you can get the handle of this window using
FindWindow(NULL,_T("<caption of this window>")
if you know this caption you can use it directly else
you can get it using the spy++ program of Microsoft Tools
then use the function FindWindow(,);
this is my understanding of your ques.and i hope to satisfy you..
amr abdel mohsen
|
|
|
|
|
HI,
I know how to print a html file using Exec command by which all the prining is done internally . But i want to whether we can do it ourself.Actually i want to change the caption in my language(other than english)in the print dialog box.Since mfc is doing it internally i don't how to change it.So kindly help.Providing some source code would be more helpfull. Thanx in advance
kesh
|
|
|
|
|
One simple way of doing that is to create webbrowser object, load url and print it using IWebBrowser2::ExecWB(OLECMD_PRINT, ...)
I think of couple ways of changing title:
1) Hook PrintDlgA & PrintDlgW (there are must be plenty examples of doing that, www.microsoft.com/msj must have it for sure ) and provide you own template or printhook procedure to hook the wm_initdialog message and change the title.
2) Set windows hook (WH_CALLWNDPROCRET) for the thread and change the title after wm_initdialog was processed.
Edward
|
|
|
|
|
i came across the article at
http://www.codeproject.com/gen/design/singleton.asp#xx372166xx
i try to compile code:
class CMsgHndlr
{
public :
static CMsgHndlr * GetMsgHndlr();
protected :
CMsgHndlr(){}
virtual ~CMsgHndlr(){}
static CMsgHndlr m_MsgHndlr; // Static instance of Message handler // class.
};
CMsgHndlr CMsgHndlr::m_MsgHndlr;
CMsgHndlr * CMsgHndlr::GetMsgHndlr()
{
return & m_MsgHndlr;
}
however, there is a error saying that:
C:\Documents and Settings\ycheok\Desktop\test\test.cpp(11) : error C2248: 'CMsgHndlr::~CMsgHndlr' : cannot access protected member declared in class 'CMsgHndlr'
C:\Documents and Settings\ycheok\Desktop\test\test.cpp(7) : see declaration of 'CMsgHndlr::~CMsgHndlr'
is there any error on the code given by that article?
thank you.
regards
yan cheng
|
|
|
|
|
Hi
I don't use that code for singleton.
You can use locki or boost and also you can read the Modern C++ design written by Andrei Alexandrescu.
Here is my usual singleton code(from the andrei book you can find it at amazon):
#pragma once
template<class Object>
class DefaultCreate{
private:
static Object * _object;
public :
static Object * Create()
{
_object= new Object;
return _object;
}
static void Destroy()
{
delete _object;
}
};
template<class Object>
Object * DefaultCreate<Object>::_object;
template<class SingletonObject,class CreatePolicy=DefaultCreate<SingletonObject> >
class Singleton
{
public:
static SingletonObject & Instance()
{
if(m_singleInstance==NULL)
{
m_singleInstance=CreatePolicy::Create();
atexit(CreatePolicy::Destroy);
}
return *m_singleInstance;
}
private:
~Singleton(void);
Singleton(void);
Singleton(Singleton &);//no copy allowed
Singleton & operator =(const Singleton&);
static SingletonObject * m_singleInstance;
};
template<class SingletonObject,class CreatePolicy>
SingletonObject * MTHSingleton<SingletonObject,CreatePolicy>::m_singleInstance=NULL;
and here is how i declare an object in singleton
class CMsgHndlr
{
void SayHello(){ cout<<"Hello theos"<<endl;
}
typedef Singleton<CMsgHndlr> test;
void gigi()
{
test::Instance().SayHello();
}
Hope this help
/theos
|
|
|
|
|
I have a question regarding Slow StretchBlt when Video Full Hardware Acceleration
is Enabled in WIndows XP.
Here is my computer's spec, (also on a Dell P4 2gHz)
AMD AthlonXP 2000+
512MB DDR266
WD 7200 40GB HD +8MB Cache
GeForce 4MX 440 64MB AGP 4x
Windows XP+SP1a+All current updates
Visual C++ 6 +SP5
I have noticed that when i switch off HW Acceleration that is set to NONE (Display
Prop>Advanced>Troubleshoot>Video HW Acceleration>None) i get faster drawing on
screen with StretchBlt upto 4-6times faster. When i switch HW Acceleration to
FULL, the drawing becomes slower. Here is a sample code that opens a CAPTURE.bmp
file of 360x360 pixel and StretchBlts to screen.
//-------------------------------------------------------
void CSlowBltDlg::OnOK()
{
//timer
CElapsed m_el;
CDC memDCLoad;
CDC *pDC;
CBitmap m_bmpBitmap;
pDC = this->GetDC();
int x_width=360;
int y_height=360;
pDC->SetStretchBltMode(COLORONCOLOR);
LoadBitmap(this,&memDCLoad);
//start timer
m_el.Begin();
pDC->StretchBlt(20,30,200,200,&memDCLoad,0,0,x_width,y_height,SRCCOPY);
//end timer and show on screen
m_el.End();
CString szTime;
szTime.Format("Time = %.3fms", m_el.m_dElapsed*1000);
pDC->TextOut(10, 10, szTime);
}
void LoadBitmap(CSlowBltDlg *myDlg, CDC *memDCLoad)
{
CDC *pDC;
CBitmap m_bmpBitmap;
pDC = myDlg->GetDC();
CString m_sBitmap;
memDCLoad->CreateCompatibleDC(pDC);
static char BASED_CODE szFilter[] = "Bitmap Files (*.bmp)|*.bmp||";
// Create the File Open Dialog
CFileDialog m_ldFile(TRUE, "*.bmp", m_sBitmap,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
if (m_ldFile.DoModal() == IDOK)
{
m_sBitmap = m_ldFile.GetPathName();
HBITMAP hBitmap =(HBITMAP)::LoadImage(AfxGetInstanceHandle(),m_sBitmap,IMAGE_BITMAP,0,0,
LR_LOADFROMFILE|LR_DEFAULTCOLOR);
if(hBitmap)
{
if(m_bmpBitmap.DeleteObject())
m_bmpBitmap.Detach();
m_bmpBitmap.Attach(hBitmap);
}
memDCLoad->SelectObject(&m_bmpBitmap);
}
}
//Timing requires CElapsed class available in zip file.. see below
//-------------------------------------------------------
With HW Acc. Full= 6.01ms
With HW Acc. None= 0.8ms
Isnt HW Acc. supposed to make drawing faster? Please comment. I am doing a
realtime image processing program and time is crucial. My current program
StretchBlts with other processing takes 252ms per frame of an image captured from
somewhere (360x360 px) on a Dell Pentium 4 2Ghz with ATI Rage 64MB card(not sure
the card type but it is ATI). Switching of HW Acceleration yields a supprising
result of only 63ms per frame at same dpi. Why is that so? Frame capture is choppy
with HW Acce ON. Is there something i must do to my app to take full advantage of
HW Acc? Thanks
The complete source & exe also available here
http://ucsnet.hypermart.net/SlowBlt.zip
|
|
|
|
|
Hello
Here at work I have inherited an mfc dll project for Visual Studio.net.
When it builds in debug mode both the dll and lib files are created successfully.
But when i build in release mode only the dll is built and not the lib file.
I was wondering if anyone had any suggestions as to how to get visual studio.net to create the missing lib file when i do a release build.
regards
Bryce
---
Publitor, making Pubmed easy.
http://www.sohocode.com/publitor
|
|
|
|
|
|
|
Hi
I want to start a totally new project using MFC or C#.
I need to have a good database environment which allows multi-user interaction so more then 1 user can run the program and do updates/deletes in the database.
What kind of database would be the best to use for this matter?
I used to use CodeBase (DBase IV) files, but that's out-of-date in my opinion + i can't force the clients to have MsAccess installed for example. Needs to work on Windows95+ until Win2003 computers.
If the environment is free .. that's an advantage too ofcourse !
Any suggestions?
Greetings,
Jens
|
|
|
|
|
One choice that comes immediately to mind is SQL Server. I'm not sure about it working with Win95, but I believe it works with Win98 and later. Your users don't need to have SQL Server installed, as you can freely distribute MSDE with your application, and MSDE will process the SQL Server commands you use.
Heard in Bullhead City - "You haven't lost your girl - you've just lost your turn..." [sigh] So true...
|
|
|
|
|
HI All
I planned to write some string into the string table of an executable file's resource and then fetch it out.
Below are my code
int main(int argc, char* argv[])
{
HANDLE hResource;
hResource = BeginUpdateResource("c:\\setupexe\\debug\\setupexe.exe", true);
//Update the resources
TCHAR testStr[] = "aaaa";
if (NULL != hResource)
{
if (UpdateResource(hResource,
RT_STRING,
MAKEINTRESOURCE(106),
MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),
testStr,
sizeof(testStr)/sizeof(testStr[0])) != FALSE)
{
EndUpdateResource(hResource, FALSE);
}
}
//Getting the resource
HRSRC hRes;
HMODULE hLibrary;
hLibrary = LoadLibrary("c:\\setupexe\\debug\\setupexe.exe");
TCHAR strBuffer[256] = "\0";
hRes = FindResource(hLibrary, MAKEINTRESOURCE(106), RT_STRING);
if (NULL != hRes)
{
int errorCode = LoadString(hLibrary, 1680, strBuffer, 256);
}
FreeLibrary(hLibrary);
return 0;
}
The point is:
I can't not get the string I just put in there. What I've got are just garbage characters.
I would appreciate if you could give my any hints about this.
Thanks
-Paul
|
|
|
|
|
This is a _PAIN_
Strings are not stored in that way in the resource table, they are stored in string blocks. The value you pass to UpdateResource is the number of the string block you wish to update, not the string...
Each block consists of 16 strings, and is layed out in memory like this:
WORD LENGTH1
TEXT STING1
WORD LENGTH2
TEXT STRING2
etc.
You find the string block you want with the following formula
nBlockID = (nStringID / 16) + 1;
Thats not all there is too it though, as you have to pass a pointer to a block of memory to updateresource that represents a string _block_ not just the string, and you have to build that block of memory up your self.
It really is sh*t.
Thankfully, there is an example in MSDN.
Search for Stablupd.exe and you will find a sample that does just what you want, study it, then shout at M$.
|
|
|
|
|
Hi Diddy
Many thanks. I've found the sample code. It works. However, just as you've mentioned, this is really terrible to use.
Thanks again for your help
-Paul
|
|
|
|
|
No Problem
I tried to do a very simply app that had a config program with it that just set a couple of string entrys in the table ages ago, had about 3 months of searching till I found that then gave up because it's so damm naff.
|
|
|
|
|
dear ll,
is there any api which can be used to get info about the system.....i.e.
processor details, cpu temp, fan speed and motherboard information?
Regards and Thnx
rIsHaBh
|
|
|
|
|
For getting Processor information and processor features, use
GetSystemInfo () and IsProcessorFeaturePresent () functions.
But dont know how to get the cpu temp and fan speed.
Regards,
Jijo
________________________________
Yesterday is history,
Tomorrow is a mystery,
But today is a present.
|
|
|
|
|
i know the problem, but windows doesn't provide any API for getting this special information.
Don't try it, just do it!
|
|
|
|
|
Hi,
TAB Messages from child dialog is not going to child dialogs message queue,but it is to the parent windows!! So whenever TAB is pressed parent window gets the focus. How to get the control to the child dialog itself!
With Best Regards,
A.Ilamparithi
|
|
|
|
|
In MFC or Win32? If Win32 are the dialogs modeless or modal? If modeless, are you calling IsDialogMessage in your message loop?
|
|
|
|
|
Hi,
If I have two doc/views and I have some data in the second viewor document.
How do I get the data from the second view document if I am currently in the first view/document.
I must be doing the dynamic_cast wrong as it is non null but I can't access any local data from the class. Has any one got a small code fragment that explains how to get to another doc/view when inside a doc/view using the CDocTemplate stuff?
I used GetDocTemplate etc but now I would to get to the current view.
Thanks,
flip
|
|
|
|
|