|
very thanx to all.
i used this code and the ram decreased to 1 MB...but obviously the virtual memory remains to about 100 MB.
The problem about doing a setsize is that the file is loaded by user input, and so i should scan the text file one time and count the number of words to set array size. And this kind of scanning on a 7MB file is slow.
|
|
|
|
|
ayol12122 wrote: there is some way to reduce this Ram abuse to a more reasonable value?
Im not entirely sure this is related or not as I use std::vector for arrays, but MSDN
CStringArray Class [^] has the following little tidbit that might be of interest to you.
MSDN wrote:
Before using an array, use SetSize to establish its size and allocate memory for it. If you do not use SetSize, adding elements to your array causes it to be frequently reallocated and copied. Frequent reallocation and copying are inefficient and can fragment memory.
I'd love to help, but unfortunatley I have prior commitments monitoring the length of my grass. :Andrew Bleakley:
|
|
|
|
|
ayol12122 wrote: ...and check in task manager...i can see about 100MB of RAM consumption.
Which is not necessarily how much RAM your process is using. The number reported by TM is actually the size of the address space. Even when you free memory, that number does not necessarily go back down. The is the way Windows' memory manager works.
"Approved Workmen Are Not Ashamed" - 2 Timothy 2:15
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
In a service that I wrote I am creating a process (using the CreateProcess API call) that is actually a bat file. When the service is signaled by the SCM that it should stop, I want to terminate the batch file and any child processes it has started. Is this possible? From looking at the props that SysInternals Process Explorer show, it would appear that any process launched by the batch file doesn't have a parent. Is there a way around this?
|
|
|
|
|
Jim Crafton wrote: Is there a way around this?
I don't know about "around" but why not through? Don't use createprocess on the "batch file", rather create the actuall processes and then your process will be the parent and it's all good.
led mike
|
|
|
|
|
Jim Crafton wrote: ...any process launched by the batch file doesn't have a parent.
Wouldn't cmd.exe be the parent?
"Approved Workmen Are Not Ashamed" - 2 Timothy 2:15
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
Apparently not according to Process Explorer. I would have thought the same thing and was really surprised to see that. Perhaps it's because I'm running this all through services?
|
|
|
|
|
Instead of using a batch file, run the apps from your own app. That way, you can call CreateProcess on all of them and stop them when you want to because you have the hwnd and processid.
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
|
Is that why you are an "outlaw" programmer because you plagiarize posts?
led mike
|
|
|
|
|
Calling TerminateProcess is a bad idea. The API is only indented to be called in extreme circumstances. When called the .EXE and all its threads are killed on the spot without getting a chance to do any cleanup. None of the DLLs get the DLL_PROCESS_DETACH or DLL_THREAD_DETACH notifications.
Steve
|
|
|
|
|
Hi All,
I created a MFC SDI EXE app. I am trying to create an Automation server. I then added a MFC class to it and selected the "TypeID" option in the wizard. The Typelib for my automation server is getting generated correctly but the registration code (generated by wizard) is not Registering this new co class.
I checked that the .REG file generated doesn't have registry code for this new class (it has code only for the document registration) AfxOleRegisterTypeLib call is also present in the InitInstance of APP class. This call succeeds when I debug but I am unable to create object of the class because there is no entry created for it in registry.
I am using VS.NET 2003 IDE. Can someone guide me on this problem?
S o h a i l K a d i w a l a
To Err Is Human; to Debug, Divine
modified 21-Apr-21 21:01pm.
|
|
|
|
|
Hi all,
I have a problem, perhaps someone can help me...
I enabled my mfc-application to dynamically load plugin dlls (MFC dlls) via a specific api.
The plugin-dll is provided by a CWnd pointer to the container window of the application and creates its window by a call like this:
<br />
CWnd* CreateMainWindow(CWnd* pParentWnd, CString& strCaption, int& idToolbarResource, UINT* pCmdIDs, int& nCmdIDs)<br />
{<br />
<br />
AFX_MANAGE_STATE(AfxGetStaticModuleState());<br />
idToolbarResource = IDR_ANALYZER_TOOLBAR;<br />
pCmdIDs[0] = g_iFirstCmdID + CMDID_ANALYZER_NEW;<br />
pCmdIDs[1] = g_iFirstCmdID + CMDID_ANALYZER_IMPORT;<br />
<br />
nCmdIDs = 2;<br />
<br />
strCaption = "NC-Prozessanalyse";<br />
<br />
if(!g_AnalyzerView)<br />
{<br />
g_AnalyzerView = new CAnalyzerView;<br />
g_AnalyzerView->Create(NULL, (LPCTSTR)"", WS_CHILD|WS_VISIBLE, CRect(0,0,0,0), pParentWnd, 0, NULL);<br />
return g_AnalyzerView;<br />
}<br />
<br />
<br />
return NULL;<br />
}<br />
So, this all works fine and I get a nice window with all kinds of stuff in it all created by the dll class CAnalyzerView in this case. As u see, I also provide the frame app by a toolbar resource, and I do a kind of dynamic Command ID handling. Everything fine so far...
...except the thing with the Message Map...
Lets assume, my CAnalyzerView should have a Combo Box. I tried 2 ways to accomplish that:
1.) using the dialog editor to create a dialog resource (IDD_ANALYZER) with a Combo Box (IDC_TOOL_COMBO) and making CAnalyzerView derived from CFormView.
When the class creates, the combo box element is displayed correctly.
BUT as soon as I create a CComboBox member variable for the combo box which is bound to the resource by a call to
<br />
DDX_Control(pDX, IDC_TOOL_COMBO, m_ComboTools);<br />
the program crashes ;-(((
2.) Second, I tried to create all dialog control elements by hand. This is a really hard job when having multiple dialog controls... I created the m_ComboTools variable in the OnCreate method of CAnalyzerView (which in the meantime become CWnd derived again) like this:
<br />
m_ComboTools.Create(WS_CHILD | WM_NOTIFY | WS_VISIBLE | CBS_DROPDOWNLIST, CRect(0,0,0,0), this, IDC_TOOL_COMBO);<br />
m_ComboTools.SetOwner(this);<br />
m_ComboTools.SetParent(this);<br />
m_ComboTools.SetFont(this->GetFont()); <br />
then I created a Messagemap entry and a callback memberfunction like this:
<br />
BEGIN_MESSAGE_MAP(CAnalyzerView , CWnd)<br />
...<br />
ON_CBN_SELCHANGE(IDC_TOOL_COMBO, OnCbnSelchangeToolCombo)<br />
END_MESSAGE_MAP()<br />
The member function OnCbnSelchangeToolCombo is NEVER CALLED!!!
Then I tried to trap the WM_NOTIFY event by overriding the OnNotify member function of CWnd like this:
<br />
BOOL CAnalyzerView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)<br />
{<br />
switch(wParam)<br />
{<br />
case IDC_TOOL_COMBO:<br />
if(lParam == CBN_SELCHANGE)<br />
OnCbnSelchangeToolCombo();<br />
break;<br />
case IDC_SEL_CHART:<br />
if(*pResult == CTCN_SELCHANGE)<br />
OnTcnSelchangeSelChart();<br />
break;<br />
<br />
}<br />
return CWnd::OnNotify(wParam, lParam, pResult);<br />
}<br />
I dont know, if the pResult or lParam parameter is responsible to deliver the Notify message. I tried both, with no effect. The IDC_TOOL_COMBO does not seem to send Notify messages.
The funny thing is, that the IDC_SEL_CHART control, which is of class CCustomTabCtrl, a class by Andrzej Markowski (here from Code Project) has no problem with sending notify messages... the CCustomTabCtrl was created the same way:
<br />
m_SelChart.Create(WS_CHILD | WS_VISIBLE, CRect(0,0,0,0), this, IDC_SEL_CHART);<br />
I dont know why it doesnt work with other elements.
I think it is a fundamental problem which lies in the architecture of the dynamically loaded mfc dll. The whole message map does not work properly, as well as the DDX stuff.
Everywhere at the interface to the frame app I used the
AFX_MANAGE_STATE(AfxGetStaticModuleState());
call as the class wizard generated code told me.
I don't know whats going wrong, please help! At this stage I have a well working plugin system, but I will have to forget it all if I couldnt get those controls and message maps to work.
Thanks in advance & plz excuse my bad english
ulretsam
|
|
|
|
|
Does DDX work in CWnd and CFormViews? I thought it was for CDialog-derived windows.
These lines shouldn't be necessary:
m_ComboTools.SetOwner(this);
m_ComboTools.SetParent(this);
Is your window class in a DLL or EXE?
None of this sounds related to MFC in a DLL to me, but there are issues (well documented) with
MFC extension DLLs (DLLs with classes which derive from MFC classes and are used by other MFC
applications).
|
|
|
|
|
Yes, you are right, DDX is for the automatic data transfer between controls and associated member variables of CDialog or CFormView derived classes.
The problem is that this mechanism works well in stand alone EXEs and DLLs which are linked at compile time.
My DLLs are linked at runtime via a call to LoadLibrary(), there is no chance for the compiler to puzzle all the message maps together I think. Somewhere there must lie the problem.
My window is created IN the DLL, the parent window is given to the DLL by a pointer to a CWnd, as you can see in my code.
Previously I said, that the whole Message map does not work. That was not correct. Messages for the window itself (i.e. WM_MOUSEMOVE, WM_CREATE, WM_SIZE) are delivered through the Message Map to the handler functions correctly. Only messages for the child windows like controls are not delivered.
I don't understand this behaviour... After 8 years MFC programming ;-((
|
|
|
|
|
ulretsam wrote: DDX is for the automatic data transfer between controls and associated member variables of CDialog or CFormView derived classes.
My mistake....I didn't realize DDX was part of CWnd, not CDialog.
Do you need to call UpdateData() to get MFC to call DoDataExchange()?
ulretsam wrote: My DLLs are linked at runtime via a call to LoadLibrary()
How do you link all the MFC classes once the DLL is loaded?? Wouldn't implicitly linking be
much easier??
Also, if you haven't done so already ... make sure you have something like this in your extension
dll:
static AFX_EXTENSION_MODULE MyDLLProjectDLL = { NULL, NULL };
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
if (!AfxInitExtensionModule(MyDLLProjectDLL, hInstance))
return 0;
new CDynLinkLibrary(MyDLLProjectDLL);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
AfxTermExtensionModule(MyDLLProjectDLL);
}
return 1;
}
Also, your EXE should be set to use MFC in a dll, not statically linked.
|
|
|
|
|
|
I found out whats going on.
I overwrote the OnCmdMessage function because stupid as I am I thought that I am not able to make dynamic message map entries like this:
<br />
ON_COMMAND(g_iFirstCmdID + CMDID_STABILITY_TRACE, OnStabilityTrace)<br />
I thought, that the first parameter in the macro has to be a constant.
The EXE dynamically distributes ranges of command IDs to all the connected Plugin DLLs. A DLL simply says at connection time how many CmdIDs it requires and then the EXE preserves this amount of IDs from a specific start-ID on. This start-ID depends on how many plugin are already connected and how many CmdIDs they require.
So I overwrote the OnCmdMessage function and the effect was that WM_COMMAND messages were not delivered to the message map. The ON_CBN_SELCHANGE of my ComboBox is also WM_COMMAND based.
I found that I received the message ON_CBN_SELCHANGE in OnCmdMessage. After that I tried to delete the OnCmdMessage and change the message map entries like above.
It works perfectly now!! Maybe I'll write an arcticle about the plugin system...
Thanks for help!
|
|
|
|
|
Have a debug failure when creating a window of my COM 3d imager.
When I created my 3d imager window inside my application…
bRet = m_pSatMap->Create("Internal_DB_SAT_Map", 0, Rect, pMainFrm, ID_SAT_MEM_MAP, NULL, FALSE);
I got an assertion error from ENSURE(afxOccMgr != NULL)”. After researching this I found that this would occur when AfxEnableControlContainer() was not call. However it is in my main but not in my subclass where the Create is called. So I added it to that class, and now I have another assertion problem. Now “ASSERT(pWndCtrl->m_pCtrlSite == NULL)” is failing.
I think I’m looking for a site that speaks to how to pass afx control to classes inside an application.
Thanks for any help
Glenn
Programmer
Glenn Earl Graham
Austin, TX
|
|
|
|
|
Does somebody has some tricks (or code) about multilanguage support ? (C++ , XML, or something else).;)
Danny Gilbert, enginneer
Montréal, Canada
|
|
|
|
|
what exactly do you want ?
i put all my GUI strings into the resource strings table, and duplicate the table for each translation i need.
in the table properties, don't forget to associate a resource language to it.
|
|
|
|
|
|
Easy question but I don't find the answer.
I have a header file with some classes. These classes used some class from one another header file.
How can I tell to compiler to use the classes from other header files ?
Extern does not work, only work on object.
Danny Gilbert
Montréal, Canada
|
|
|
|
|
dannygilbert3 wrote: How can I tell to compiler to use the classes from other header files ?
#include "OtherHeaderFile.h"
|
|
|
|
|
#include is the directive for you...
|
|
|
|
|
If you only need to declare pointers or references to those other classes, you can do a forward declaration (I believe that is what it is called) by putting code like this:
class CClass;
class CSomeOtherClass; Before the code that declare pointers/references to that class.
class CClass;
class CSomeOtherClass;
class CMyClass
{
public:
CMyClass( CClass *pClass );
CMyClass( CSomeOtherClass &socSomeOtherClass );
<code>CMyClass( CAnotherClass *pAnotherClass );</code> <code>
<code>CMyClass( CAnotherClass &cacAnotherClass );</code> <code>
}; If you need to actually access members of the class, then you need to include the entire declaration of the class (usually by including its .H file). This is usually required in the CPP file for the class that uses the other classes. Be careful throwing includes around freely if you are not fully familiar with the code, you can introduce dependency problems and/or mess up your build times.
Peace!
-=- James If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong! Avoid driving a vehicle taller than you and remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road! DeleteFXPFiles & CheckFavorites (Please rate this post!)
|
|
|
|
|