|
jhoin wrote:
How does one distinguish virtual memory and regular ram?
Virtual memory is the amount of RAM + swap files. You can have as large as a 4GB swapfile on every drive in your system. The address space of a single process is limited normally to 2GB with the largest block you can allocate being less than 1.3 GB because of memory fragmentation caused by dlls not loading sequentially in your address space.
jhoin wrote:
Oftentimes, the problem occurs right after the program starts up.
Then it is probably not a memory problem. How many threads are you spawning?
John
|
|
|
|
|
John,
Thanks for the primer on memory. I agree I don't think memory is a problem.
I am only spawning 3 threads at a time. It just doesn't make sense. The frequency of the problem depends on the machine it is being run on. I am at my wits end on this one.
Any arbitrary suggestions?
Jay
|
|
|
|
|
Are you putting in NULL for the Security descriptor parameter?
John
|
|
|
|
|
Post the code that spawns the thread including the parameters.
Keep a system log. I suspect that maybe one or more processes is taking up too much resources or that the issue has to do with system security.
Kuphryn
|
|
|
|
|
Here is the code which has been pared down a bit to get rid of unrelated initialization:
(one note: this routine itself was started as a thread so it is second in line and is trying to start a third thread.)
unsigned __stdcall micro_main(void *dummy)
{
unsigned threadID;
//other unrelated code
PSECURITY_DESCRIPTOR pSD;
SECURITY_ATTRIBUTES sa;
pSD = (PSECURITY_DESCRIPTOR) LocalAlloc( LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);
if (pSD == NULL)
{
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,NULL, GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR) &lpMsgBuf,0,NULL );
MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
LocalFree( lpMsgBuf );
}
if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION))
{
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,NULL, GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR) &lpMsgBuf,0,NULL );
MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
LocalFree( lpMsgBuf );
}
if (!SetSecurityDescriptorDacl(pSD, TRUE, (PACL) NULL, FALSE))
{
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,NULL, GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR) &lpMsgBuf,0,NULL );
MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
LocalFree( lpMsgBuf );
}
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = pSD;
sa.bInheritHandle = TRUE;
MICRO_THREAD_SUB = (HANDLE)_beginthreadex( &sa, 0, &sub_main_MACRO_CONTROL, NULL, 0, &threadID );
if (MICRO_THREAD_SUB == 0)
{
// it is here that that I always get the error
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,NULL, GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR) &lpMsgBuf,0,NULL );
MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
LocalFree( lpMsgBuf );
}
else
{
WaitForSingleObject(MICRO_THREAD_SUB,INFINITE);
CloseHandle(MICRO_THREAD_SUB);
}
// _endthreadex(0);
}
/*this is the thread which is called which immediately calls another thread-could that char com[200000]; be part of the problem? (it was used for some early debugging and no longer has any functionality.*/
unsigned __stdcall sub_main_MACRO_CONTROL(void *dummy)
{
char com[200000];
Run_Parser_Simulation(Sim->MACRO);
// _endthreadex(0);
return 0;
}
Thanks for looking at this. Regards,
Jay
|
|
|
|
|
There is quite a bit going on in the code including the call to LocalAlloc().
pSD = (PSECURITY_DESCRIPTOR) LocalAlloc( LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);
Try passing in __beginthreadex() default parameters, i.e. NULL, etc. to make sure the callback function is valid.
Kuphryn
|
|
|
|
|
Kuphryn,
Thanks for your answer. I brought in the PSECURITY_DESCRIPTOR code as a response to the memory allocation errors. Before that I used _beginthreadex() without default parameters. The problem is that the memory allocation errors only occur intermittantly and in what seems to be an unreproducible manner.
Jay
|
|
|
|
|
Or is it a deadlock somewhere?
Sonork 100.41263:Anthony_Yio
|
|
|
|
|
What do you mean by a deadlock?
Regards,
Jay
|
|
|
|
|
thread A holding resource A and waiting for resource B
thread B holding resource B and waiting for resource A
Causing infinite waiting for resources of both threads.
Check out multithreading management topic.
Sonork 100.41263:Anthony_Yio
|
|
|
|
|
Anthony,
That is not quite the logic I am using. It is:
thread A launches thread B and continues on so that GUI is responsive
thread B launches thread C and waits for thread C to finish.
This should be o.k., I think.
Jay
|
|
|
|
|
i am using a visual studio add in.
in one of the methods i am using
CWinApp* pApp = AfxGetApp();
i need to get a pointer the visual studio app, not the add in app,
in both cases, even if i use or don't use
AFX_MANAGE_STATE(AfxGetStaticModuleState())
i get a pointer to the add in app
and not the pointer to the visual studio (exe)
how can i retrieve the pointer to the visual studio exe???
thanks
Yaron
Ask not what your application can do for you,
Ask what you can do for your application
|
|
|
|
|
im not very experienced in add in´s - would FindWindow() or FindWindowEx() help?
|
|
|
|
|
nop, not in this matter....
(thanks anyway)
any other suggestions?
Ask not what your application can do for you,
Ask what you can do for your application
|
|
|
|
|
Is this a VS.NET or a VC 6 add-in?
|
|
|
|
|
VC 6
Ask not what your application can do for you,
Ask what you can do for your application
|
|
|
|
|
Wouldn't you just use the IApplication pointer that gets passed to IDSAddIn::OnConnection?
|
|
|
|
|
my original problem was how to get the *.dsw file.
i saw a code that does that :
CString CCommands::GetWorkspacePath()
{
CWinApp* pApp = AfxGetApp();
ASSERT(NULL != pApp);
CString szWorkspace(_T(""));
POSITION posdt = pApp->GetFirstDocTemplatePosition();
while (NULL != posdt)
{
CDocTemplate* pdt = pApp->GetNextDocTemplate(posdt);
if (0 == strcmp("CProjectWorkspaceDocTemplate",
pdt->GetRuntimeClass()->m_lpszClassName))
{
POSITION posdoc = pdt->GetFirstDocPosition();
if (NULL == posdoc)
break;
CDocument* pdoc = pdt->GetNextDoc(posdoc);
if (NULL == pdoc)
break;
szWorkspace = pdoc->GetPathName();
if (!szWorkspace.IsEmpty())
break;
}
}
return szWorkspace;
}
trouble was that when i run this code i got NULL for this line:
POSITION posdt = pApp->GetFirstDocTemplatePosition();
that's what led me to think that the pApp is the dlls therefor it can not get the doc template (cause it doesn't have one) what it should be is the dev studio exe and have a doc template.....
can you help me here? i am really desperate no one could help me here...
thanks again
Yaron
Ask not what your application can do for you,
Ask what you can do for your application
|
|
|
|
|
Yaron,
While I'm not sure exactly what you're trying to accomplish, it seems to me that using the DocView hierarchy exposed by DevStudio rather than its automation interface is way more work than its worth.
The IApplication pointer that gets passed to OnConnection is a pointer to the DevStudio instance in which your add-in is running. It includes an entire COM object hierarchy that allows you navigate windows, projects, files, etc.
Look for IApplication in the DevStudio version of MSDN (not the newer MSDN that comes with VS.NET). It's got an easily navigable hierarchy that should get you where you need to be.
don
|
|
|
|
|
I know the this heirarchy, already read the MSDN,
the thing i try to accomplish is when i open a project in the dev studio then usign my add-in i want to get the entire path of the *.dsw file....
i could not find any code for doing that (getting the *.dsw file)
can you help?
thanks again
Yaron
Ask not what your application can do for you,
Ask what you can do for your application
|
|
|
|
|
What does Application::ActiveProject::FullName return?
|
|
|
|
|
it returns the *.dsp name of the active project....
i can not just do concatonation like this
ProjectName.dsp --> ProjectName. --> ProjectName.dsw
because it is not insured that the name of the dsw is the name of the active project.....
"help i need sombody , help is there anybody, help you know i need some HHHEEEELLLPPP"
thanks again
Yaron
Ask not what your application can do for you,
Ask what you can do for your application
|
|
|
|
|
OK, one last idea and then I'm out of suggestions:
Have you tried looping through the Application::Documents collection looking for a file with the dsw extension?
|
|
|
|
|
this i haven't tried yet, so i will try it now, but my guess is that the documents collection is empty at this stage.....but i will sure try it now and let you know
thanks for all the trouble
cheers,
Yaron
Ask not what your application can do for you,
Ask what you can do for your application
|
|
|
|
|
YaronNir wrote:
i need to get a pointer the visual studio app, not the add in app,
What you describe is the difference between a MFC regular DLL and an MFC extension DLL. An extension DLL uses the CWinApp of the EXE, so that's the type of DLL you need to use.
--Mike--
Ericahist | CP SearchBar v2.0.2 | Homepage | RightClick-Encrypt | 1ClickPicGrabber
There is a saying in statistics that a million monkeys pounding on typewriters would eventually create a work of Shakespeare. Thanks to the Internet, we now know that this is not true.
|
|
|
|