|
Hi everyone,
I have a doubt regarding setting and getting of menus. I change the menu of my frame using:
pMainFrame->MDISetMenu(ptrToAValidMenuTobeLoaded);(pMainFrame = this is the pointer to my Valid Frame)
But when i say :
CMenu* pSetMenu = AfxGetMainWnd()->GetMenu();(GetMenu function of CWnd class)
iam not getting the menu.(pSetMenu is NULL)
Does MDISetMenu of MDIFrameWnd Class and SetMenu of CWnd class, sets menus at different places?
How can i Get my menu attached with my Main window.(is there any other method of doing the same)
Note:
After my application loads iam able to see that the menu is set properly and iam able to see it also.
Thanks a lot for replies and/or reading the same,
thnx
KAB
|
|
|
|
|
I am trying to use the WaitCommEvent function to listen for a signal coming through pin 6 on an RS232. Before i listen i want to send two signals out on different pins. I can already send the signals succesfully, however, does anyone have an example of using WaitCommEvent to listen for a signal that i can view ?
|
|
|
|
|
|
That site is great.. Thanks for that. However here is my delimma
On the 9 pin rs232, i am suing 5 pins to set and monitor.
Pins 2 and 3 are in use continuosly (Recieve and Transmit data)
Pins 4 and 7 (DTR and RTS) are used on occasion and are set high , then set low afterwards.
Pin 6 (DSR) , i need to monitor the input after i set Pin 4 and 7(DTR and DTS)
Can i monitor Pin 6 without using WaitCommEvent?
If so, how will i syncronize all this with just one handle to the COM port?
|
|
|
|
|
Taken from the MSDN :
#include <windows.h>
#include <assert.h>
#include <stdio.h>
void main( )
{
HANDLE hCom;
OVERLAPPED o;
BOOL fSuccess;
DWORD dwEvtMask;
hCom = CreateFile( "COM1",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL
);
if (hCom == INVALID_HANDLE_VALUE)
{
printf("CreateFile failed with error %d.\n", GetLastError());
return;
}
fSuccess = SetCommMask(hCom, EV_CTS | EV_DSR);
if (!fSuccess)
{
printf("SetCommMask failed with error %d.\n", GetLastError());
return;
}
o.hEvent = CreateEvent(
NULL,
FALSE,
FALSE,
NULL
);
o.Internal = 0;
o.InternalHigh = 0;
o.Offset = 0;
o.OffsetHigh = 0;
assert(o.hEvent);
if (WaitCommEvent(hCom, &dwEvtMask, &o))
{
if (dwEvtMask & EV_DSR)
{
}
if (dwEvtMask & EV_CTS)
{
}
}
else
{
DWORD dwRet = GetLastError();
if( ERROR_IO_PENDING == dwRet)
{
printf("I/O is pending...\n");
}
else
printf("Wait failed with error %d.\n", GetLastError());
}
}
Ask not what your application can do for you,
Ask what you can do for your application
|
|
|
|
|
Is there any utility which tells C,C++ prgrams performace...? in terms of CPU utilization like..
|
|
|
|
|
what do you want to know exactly ??
|
|
|
|
|
I have code like
int array[10]={10 elements}
int *ptr=array;
int value=0;
here are 2 code fragments
1) for(int i=0;i<10;i++)
value=*(ptr+i);
2) for(int i=0;i<10;i++)
value=*ptr++;
I want to check performance of (1) against (2)
|
|
|
|
|
CString sError="QueryPerformanceCounter() failed for unknown reason";
BOOL bResult=FALSE;
CString sResult="";
LARGE_INTEGER largeStart;
LARGE_INTEGER largeEnd;
LARGE_INTEGER largeFrequency;
_int64 qwordResult=0;
_int64 qwordFrequency=0;
SetThreadAffinityMask(GetCurrentThread(),1); // Prevent multiple CPU's from messing the benchmark up
QueryPerformanceFrequency(&largeFrequency);
bResult=QueryPerformanceCounter(&largeStart); // Get initial counter. Start the test
if (bResult) {
PerformTask(); // Run the test
bResult=QueryPerformanceCounter(&largeEnd); // Get the final counter. End the test
qwordResult=(largeEnd.QuadPart-largeStart.QuadPart); // The elapsed time for the test in counter ticks
qwordFrequency=largeFrequency.QuadPart; // How many times per second the counter ticks
sResult.Format("Ticks = %I64d\nTicks per second = %I64d",qwordResult,qwordFrequency);
if (bResult)
AfxMessageBox(sResult);
else
AfxMessageBox(sError);
} else
AfxMessageBox(sError);
|
|
|
|
|
you already asked this some days ago, and the answer have been saying that 1) was a little bit faster (less assembler instructions) than 2).
why do you re ask it ??
-- modified at 9:15 Tuesday 4th April, 2006
|
|
|
|
|
I used one software for performance measurement.
It says exactly oppsite of what we concluded last time.
|
|
|
|
|
2 questions :
1) how does that tool measure the perf ? (consider spoting the accuracy)
2) why do you need that much precision ? can't you refer to the assembler code generated by the compiler ?
|
|
|
|
|
for small values (10) there will not be a significative difference.
Try with 1000000 or more iterations; maybe at this size you will be able to use a simple chronometer.
or try this simple class CProfiler[^] which works well to profile simple functions.
Maximilien Lincourt
Your Head A Splode - Strong Bad
|
|
|
|
|
HI,
The link u have mentioned is really helpful..Sooner I will publish the results...Thanx a lot for valuable input !
Vikrams
|
|
|
|
|
yes, it's called a Profiler.
it used to be bundled with Visual Studio 6. in newer version ( VS2003 and VS 2005 ( i think ) ) it's not there, you have to go to a 3rd party ( devparter profiler ).
Maximilien Lincourt
Your Head A Splode - Strong Bad
|
|
|
|
|
|
what was wrong with THIS[^] ?
|
|
|
|
|
hi
i have a vc++6 MFC app. in my main i start a thread that connects to the wmi of a host, it uses
IWbemLocator *pLoc
IWbemServices *pSvc
back in the main, once the thread has finished connecting to the wmi of the host, it is queryied but the two global variables above are "empty", this is because you cannot use COM interfaces on multiple threads and each thread must initialize COM itself and onyl use local COM objects afaik.
so i think marshalling will have to be used but i dont know where to start on how to implement it
please help
|
|
|
|
|
Whenever you cross apartment boundaries you have to marshal the interface.
An apartment is, in simple words, a thread that has made a successful call to ::CoInitialize() or similar. Each thread that will use COM in any way have to initialize COM by calling ::CoInitialize(), which tells the COM subsystem that this-apartment-is-a-single-threaded-apartment (STA). If you want your thread to be added the the multithreaded apartment of the process (MTA), because there can be only one, you have to call ::CoInitializeEx() with COINIT_MULTITRHEADED.
The easiest way to marshal an interface is to use ::CoMarshalInterThreadInterfaceInStream()[^] and ::CoGetInterfaceAndReleaseStream.
Hope this helps
--
Roger
It's supposed to be hard, otherwise anybody could do it!
|
|
|
|
|
so will i get away with using CoInitializeEx() with COINIT_MULTITRHEADED and not having to use marshalling?
|
|
|
|
|
no!
the CoInitializeEx() with COINIT_MULTITRHEADED tells what type of apartment do you wishes to use in yourcase MTA.
unfortunately, you will have to do marshaling yourself,use the 2 methods suggested above
hope it helps
Ask not what your application can do for you,
Ask what you can do for your application
|
|
|
|
|
viperlogic wrote: so will i get away with using CoInitializeEx() with COINIT_MULTITRHEADED and not having to use marshalling?
In theory this is possible and usually requires the free-threaded-marshaler (FTM) and you also have to be aware that when your thread that created the server finishes it has to call ::CoUninitalize() which unloads the COM library for that thread which can get you into trouble.
It also depends on the server whether it supports free-threading or not.
The use of free-threading is usually complicated and not for the faint-hearted.
If you really want to create the server to be created in a secondary thread, I suggest you create the server and marshal the interface back to the main thread, or whatever thread you like, by ::CoMarshalInterThreadInterfaceInStream() and ::CoGetInterfaceAndReleaseStream().
You can alert the receiving thread by posting a message or setting an event informing the thread that the server is created and the interface can be retrieved with ::CoGetInterfaceAndReleaseStream().
This is not so complicated compared to free-threading. In other words: a good place to start.
N.B. since this kind of questions are COM related you should post in the COM forum instead.
Hope this helps
--
Roger
It's supposed to be hard, otherwise anybody could do it!
|
|
|
|
|
Hi,
I have to draw line in screen.
I tried a lot of things,but it does not draw.Following functions i used in my codings.
void CPerfGrapView::OnDraw(CDC* pDC)
{
// TODO: add draw code here
GetClientRect(&mClientArea);
pMemDC->FillRect(&mClientArea,&CBrush(RGB(66,60,66)));
pMemDC->SetBkMode(TRANSPARENT);
CFont *pOFont = pMemDC->SelectObject(&TextFont);
if(!pOFont)
{
AfxMessageBox(IERR_GDIFAIL);
return;
}
CPen *pOPen = pMemDC->SelectObject(&penGraph);
pMemDC->SetBkColor(RGB(0,0,0));
pMemDC->SetTextColor(RGB(255,255,255));
pMemDC->TextOut(::AlignX(300,mClientArea),::AlignY(30,mClientArea),"Perfor");
pMemDC->SelectObject(&penGraph);
//pMemDC->TextOut(500,400,"PERFORMANCE GRAPH VIEW");
}
///
int CPerfGrapView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
pMemDC = new CDC;
if(!pMemDC)
{
AfxMessageBox(IERR_MEMFAIL);
return -1;
}
pBitmap = new CBitmap;
if(!pBitmap)
{
AfxMessageBox(IERR_MEMFAIL);
return -1;
}
CDC *pDC = GetDC();
pMemDC->CreateCompatibleDC(pDC);
pBitmap->CreateCompatibleBitmap (pDC, 800, 640 );
pMemDC->SelectObject( pBitmap );
if(!TextFont.CreateFont(14,0,0,0,400,FALSE,FALSE,0,ANSI_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,DEFAULT_PITCH|FF_ROMAN,NULL))
{
AfxMessageBox(IERR_GDIFAIL);
return -1;
}
if(!penGraph.CreatePen(NULL,NULL,RGB(255,255,255)))
{
AfxMessageBox(IERR_GDIFAIL);
return -1;
}
ReleaseDC(pDC);
return 0;
}
BOOL CPerfGrapView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CBrush brBkGround(RGB(66,60,66));
CBrush brBkGround(RGB(0,0,0));
CBrush *pbrOld = pDC->SelectObject(&brBkGround);
CRect rc;
pDC->GetClipBox(&rc);
pDC->PatBlt(rc.left, rc.top, rc.Width(),rc.Height(), PATCOPY);
pDC->SelectObject(pbrOld);
return TRUE;
//return CView::OnEraseBkgnd(pDC);
}
I declared all variables in my header file.
This is my Coding.But it does not draw anything in screen.Can u find it.
It simply shows the Blank Background.
|
|
|
|
|
It looks like you are drawing everything on your memory DC but you forgot to paste everything back on your CDC in OnDraw.
|
|
|
|
|
Hi Anu_Bala,
your code draw only background
and if change pMemDc it darw pMemDC->TextOut(::AlignX(300,mClientArea),::AlignY(30,mClientArea),"Perfor");
But pMemDC->TextOut(300,30,"Perfor",6);
with white color
and another variables pMemDC,pBitmap
Can you be more specific
|
|
|
|
|