|
MFC has different HWND Maps for Different Threads
If a window is created in one thread and the CWnd * ptr is used in another thread ASSERT Failure will occur , not sure if this is the problem here but
Try to use the HWND instead of CWnd
might work
Hope it Helps
C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, it blows away your whole leg
|
|
|
|
|
Just a question
void main(void)
{
int i;
for(i=0;i<100;i++)
{
Check(1);
}
}
void Check(int i)
{
char szMsg[100];
}
if the Check function will be called 100 times, will the szMsg be
1) created and disallocated 100 times as well
2) created once and remained till the Main ended
3) created once and not freed at all
4) created 100 times and not freed at all
if the answer is 1 or 2, then what is the difference / advantages if i use malloc or LocalAlloc instead? will there be performance problem?
I am doing a project on embedded device and memeory managment is crucial.
I thanx anyone who gave me expertise answer.
|
|
|
|
|
Short answer: 1
But note that it is created on the STACK and not on the HEAP (like malloc would).
In an ideal world this wouldn't take any time at all (the SP has to be adjusted anyway) but (and I'm not 100% sure about this) the compiler might decide that the memoryblock needs to be zeroed out which ofcourse takes time.
By using malloc instead you would be going through the memorymanager which tracks the allocated blocks which is pretty slow.
The fastest way (IF the compiler clears the block) would be to declare the block static.
And if the paths that I have followed/have tread against the flow/there is no need for sorrow
I am coming home
Return, Crüxshadows
|
|
|
|
|
In Window CE devices, Will there be any difference in creating on the stack and heap?
I have a current program that sometimes during usage by client, will cause the program to crash.Went through the codes and debugging, still cannot find the bug. It only happens randomly but particularly at a specific places where there is a lot of loading of GUI on the screen.
Hence, i need to fine tune all this problems, hopefully an upgrade on the program won't cause this program. I am also trying the try-except method to prevent exception error.
|
|
|
|
|
Another factor to consider is the limited amount of stack available; by default, you have 64KB of stack, which has to encompass all of your thread's execution. If you run out of stack, Windows CE will raise a Stack Overflow exception. You shouldn't try to catch this - it indicates a serious problem. If uncaught, the thread will be terminated.
You should really only use the stack for short-lived items and in leaf functions (functions that call no other functions). Using the stack for anything that will have a long lifetime (e.g. your main frame window) isn't a good idea.
|
|
|
|
|
According to the C++ language definition, the variable szMsg is allocated on entry to the Check() function, and deallocated on exit.
Typically, and in the Windows environment, local memory used in this way is from the stack. Stack allocations and deallocations are inexpensive, since they usually amount to moving the stack pointer by the size of the value.
In the embedded environment, however, things may be different. Depending on the CPU architecture, local memory may be managed via a heap or some other structure. The cost of local memory depends upon the CPU and how the compiler is implements it. PIC microcontrollers, for example, typically only store return addresses on the stack. Local memory is managed via a heap or statically through call graph analysis.
Software Zen: delete this;
|
|
|
|
|
In microcontollers (8051), the code segment and data segment is embedded in to the chip, while Stack and heap can be on RAM.
Hope it helps.
|
|
|
|
|
Hey all.
I have my main app. On the main dialog window, there is a progress bar. I am writing a file archiving utility that uses someone elses ZIP class to zip up the files. Some of the files, however are extremely big, so when the "add" portion of their class gets called, it just sits there for 30 seconds without showing the user anything. I actually have the .h and .cpp from the class, so I can make modifications to it. I found the place where it loops through and adds the file to the zip file. What I would like to be able to do is update a progressbar on the main dialog window during this loop. I have no idea how I would tell the ZIP class that there is a progress bar on the main dialog. Any ideas?
Thanks in advance!
|
|
|
|
|
Put the "zipping" code in a worker thread, and modify the code to post an "update" message to the primary thread. In the primary thread's response to this message, update the progress bar.
A rich person is not the one who has the most, but the one that needs the least.
|
|
|
|
|
I have a program that's using a lot of cpu (that is the meaning) now i want to stop this progress when a key is press'd like the ESC(27)key, what do i need to do to get this working ??
|
|
|
|
|
|
okay apart from im a newb, im trying to send a file between my client and server in vc++,it works fine with text files and also it works fine localy,when i x-fer a .exe over a network the x-fer fails,i know this is coz winsock's send function cant handle the size of the file im tryin to send,my problem is i need to read a file into a buffer,then make a loop and send parts of the buffer in chunks untill the whole file has been sent this wouldnt be to hard but i dont know how to erase the data alreadie sent from the buffer and then carry on from where it left of,i have tried and failed at doing this and im lookin for some extra help.
const char * filename = downloadbuf.c_str();
char buffer[40500] = "";
long size = 0;
std::ifstream file (filename, std::ios::in | std::ios::binary | std::ios::ate);
if (!file)
{
MessageBox(NULL,"Error Opening File",NULL,MB_OK);
}
size = file.tellg();
file.seekg (0, std::ios::beg);
file.read (buffer, size);
char sizebuf[50];
ltoa(size,sizebuf,10);
send(newsock,sizebuf,strlen(sizebuf),0);
long sent;
//some sort of do while loop here
sent = send(newsock,buffer,size,0);
or rather than having such a big buffer if i read a chunk of the file then sent it then read another chunk of the file!
any ways thanx for ya time,any help wud be much apriciated
|
|
|
|
|
I took this from an online example.
using VC++ 7 if you write...
int StudentAge;<br />
<br />
<br />
cout << "Student age = " << StudentAge << endl; <br />
<br />
cout << endl;<br />
You will (rightly) get a runtime check failure since StudentAge has not been initialized.
What I'd like to know is why THIS works
int StudentAge;<br />
int* ptrAge;<br />
<br />
ptrAge = &StudentAge;<br />
<br />
cout << "Student age = " << StudentAge << endl; <br />
<br />
cout << endl;
Here I don't get a runtime check failure even though it's clear StudentAge still hasn't been initialized. I'm just curious as to why this is the case.
Thanks
Woke up this morning...and got myself a blog
|
|
|
|
|
Neither case should issue a runtime error.
The first case will issue a compiler warning (variable used without being initialized), depending on your compiler options.
The second case is sufficient to mark the variable StudentAge as having been 'touched' (by the & operator), hence the warning wouldn't be appropriate. The compiler isn't (and shouldn't be, IMO) smart enough to look for secondary effects. Perhaps the variable gets initialized as a side effect, via the pointer.
Software Zen: delete this;
|
|
|
|
|
Thanks Gary, I used the term "Runtime Check Failure" because that's what the VC++7 warning dialog says (at runtime I might add). I guess I haven't set up my IDE to warn me on such things because the compile in the first case is clean as a whistle
Thanks!!
Woke up this morning...and got myself a blog
|
|
|
|
|
Hmmm. Is this Managed C++, by any chance? I'm just curious. I write 'unmanaged' C++, and have never seen this behavior at runtime.
Software Zen: delete this;
|
|
|
|
|
|
From the compiler documentation, /RTC switch:
[quote]
/RTCu
Reports when a variable is used without having been initialized. For example, an instruction that generates C4701 may also generate a run-time error under /RTCu. Any instruction that generates C4700 will generate a run-time error under /RTCu.
However, consider the following code fragment:
int a, *b, c;
if ( 1 )
b = &a;
c = a; // no run-time error with /RTCu
If a variable could have been initialized, it will not be reported at run time by /RTCu. For example, after a variable is aliased through a pointer, the compiler will not track the variable and report uninitialized uses. In effect, you can initialize a variable by taking its address. The & operator works like an assignment operator in this situation.
[/quote]
[edit] Made attribution clearer. [/edit]
|
|
|
|
|
|
Hi,
I'm trying to make a program in C++ that calculates and prints all the potential partitions of a group of n elements to groups of k elements (n is a integer multiplicate of k).
For example if n=4, k=2 :
{{a1,a2}, {a3,a4}}
{{a1,a3}, {a2,a4}}
{{a1,a4}, {a2,a3}}
I really need an algorythm about this so if you have a suggestion or if you know any links about Discrete Mathematics Algorythms i would appreciate it.
(Sorry if my English are bad)
Paparia Mantoles!
|
|
|
|
|
is this really a math problem?
Don't try it, just do it!
|
|
|
|
|
I derived a class from CListBox. In that class I added a handler for the right mouse button. When I click the right button, the menu pops up on my desktop. I know why its doing this, because the CPoint passed to the function is relative to the whole screen, not my listbox.
I cant figure out how to tell the menu to popup where my mouse is.
I tried ScreenToClient() but it didnt work.
<br />
void CMyListBox::OnRButtonUp(UINT nFlags, CPoint point) <br />
{<br />
CMenu Menu;<br />
Menu.LoadMenu(IDR_POPUP_MENU);<br />
CMenu *Popup = Menu.GetSubMenu(0);<br />
ScreenToClient(&point);<br />
Popup->TrackPopupMenu(TPM_LEFTBUTTON|TPM_RIGHTBUTTON|TPM_LEFTALIGN, <br />
point.x, point.y, this, NULL);<br />
Menu.DestroyMenu();<br />
}<br />
Anybody help?
Thanks!
|
|
|
|
|
The point is given to you in client coords, and TrackPopupMenu() expects screen coords, so use ClientToScreen() to convert the point.
Sonork 100.11743 Chicken Little
"You're obviously a superstar." - Christian Graus about me - 12 Feb '03
Within you lies the power for good - Use it!
|
|
|
|
|
You have two problems. First, the point parameter is in window coords, not screen coords. Second, TrackPopupMenu() takes screen coords for the menu location. So you should call ClientToScreen(&point)
--Mike--
Ericahist | CP SearchBar v2.0.2 | Homepage | 1ClickPicGrabber New v2.0.1! | RightClick-Encrypt
You cannot truly appreciate Dilbert unless you've read it in the original Klingon.
|
|
|
|
|
Or you could just call
::GetCursorPos(&point);
Which will give you the current mouse position in screen coordinates
Roger Allen - Sonork 100.10016
Roger Wright: Remember to buckle up, please, and encourage your friends to do the same. It's not just about saving your life, but saving the quality of life for those you may leave behind...
|
|
|
|
|