|
can you explain a little more ? thanks
|
|
|
|
|
|
Why the above code could be deadlock. thanks
|
|
|
|
|
Because they are both using the same variable without checking that it is free to update. Follow the link in my response and read about thread synchronisation.
|
|
|
|
|
So use While(cx != True) ; similar code could resolve it?
|
|
|
|
|
Possibly, but threads do not always behave the way you expect.
|
|
|
|
|
Sure, the code is embedded software code, no OS, so, do you think there is a better way to implement the condition variable?
|
|
|
|
|
That's a whole new question.
|
|
|
|
|
Hey Guys,
I'm writing an application in C++ that needs to write shared memory to windows and I've hit a stumbling block.
Even though I'm not getting any error messages (I've stepped through with the debugger) it would appear nothing is writing to shared memory. Here is the code that writes the shared memory,
void Write_Physics(PhysicsStruct *s_physics)
{
TCHAR szName[] = TEXT("Local\\physics");
hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(PhysicsStruct), szName);
if (!hMapFile)
{
return;
}
mapFileBuffer = (unsigned char*)MapViewOfFile(m_physics.hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(PhysicsStruct));
if (!mapFileBuffer)
{
return;
}
CopyMemory(mapFileBuffer,s_physics,sizeof(PhysicsStruct));
UnmapViewOfFile(m_physics.mapFileBuffer);
CloseHandle(m_physics.hMapFile);
}
My difficulty is that when I try another process to read the shared memory nothing is happening. For completeness here is the code that reads the structure from the shared memory,
void Read_Physics(PhysicsStruct *s_physics)
{
TCHAR szName[] = TEXT("Local\\physics");
hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(PhysicsStruct), szName);
if (!m_physics.hMapFile)
{
return;
}
mapFileBuffer = (unsigned char*)MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, sizeof(PhysicsStruct));
if (!mapFileBuffer)
{
return;
}
s_physics = (PhysicsStruct*)mapFileBuffer;
UnmapViewOfFile(mapFileBuffer);
CloseHandle(hMapFile);
}
If anyone has any suggestions it would be greatly appreciated. What the problem resembles is like trying to write something to file and forgetting the fprintf or file write commands.
Thanks in advance guys.
|
|
|
|
|
Where is hMapFile declared?
void Read_Physics(PhysicsStruct *s_physics)
{
TCHAR szName[] = TEXT("Local\\physics");
here >>>> hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(PhysicsStruct), szName);
if (!m_physics.hMapFile)
{
return;
}
mapFileBuffer = (unsigned char*)MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, sizeof(PhysicsStruct));
if (!mapFileBuffer)
{
return;
}
s_physics = (PhysicsStruct*)mapFileBuffer;
UnmapViewOfFile(mapFileBuffer);
CloseHandle(hMapFile);
}
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
There is another problem with the code for the Read function:
You're passing the pointer s_physics by value. This is not going to do what you want. You need to pass the pointer's address.
You would do that like so:
void Read_Physics(PhysicsStruct **s_physics)
Then inside the function:
*s_physics = (PhysicsStruct*)mapFileBuffer;
And the read function would be called thusly:
Read_Physics(&s_physics);
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
Richard,
Many thanks for answering. My apologies I wrote this as pseudo code to try and save time. The declarations for those are,
HANDLE hmapFile;
unsigned char *mapFileBuffer;
They are at the beginning of each function. The joys of doing this at 1:00am!
Copy you on the declaration of the read function - leave that with me to sort out.
Apart from this is there any other reason you can see for this and particular the write function not working?
Many thanks in advance.
|
|
|
|
|
D_code_writer wrote: I wrote this as pseudo code to try and save time.
It's not helpful if you post code that is not the actual code that is causing the problem.
I can see one other BIG problem:
You're setting s_physics to point to the memory of the file map, but then you're closing the file mapping!
EDIT:
The problem is the same with the write function. You're writing to the memory, but then you're closing the file mapping! The read function cannot read from a file mapping that doesn't exist.
I think this is the main reason it's not working. You need to copy the memory pointed to by mapFileBuffer, and return that as your result. Then you'll need to free this memory somewhere else.
So, in pseudo code:
Read Function:
Create File Map;
Allocate new memory = sizeof(PhysicsStruct);
Copy memory from File Map to new memory;
Set s_physics = new memory;
return s_physics;
The difficult we do right away...
...the impossible takes slightly longer.
modified 3-Aug-18 8:48am.
|
|
|
|
|
Richard,
Copy that - I actually figured it out. I found an old VC++ 6 project called MMFAPP1. That actually worked. Here is the crux of the fix.
Declare the following variables,
HANDLE m_hFileMMF;
LPVOID m_pViewMMFFile;
Then create the file handle,
m_hFileMMF = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,4*1024,"MyMMF");
DWORD dwError = GetLastError();
if ( ! m_hFileMMF )
{
MessageBox(_T("Creation of file mapping failed"));
}
else
{
m_pViewMMFFile = MapViewOfFile(m_hFileMMF,FILE_MAP_ALL_ACCESS,0,0,0);
if(! m_pViewMMFFile )
{
MessageBox(_T("MapViewOfFile function failed"));
}
}
Once that is done to write the data to the shared memory we have
PhysicsStruct s_physics;
if(m_pViewMMFFile )
CopyMemory(m_pViewMMFFile,&s_physics,sizeof(PhysicsStruct));
To read from the shared memory we have,
if(m_pViewMMFFile )
CopyMemory((PVOID)&s_physics,m_pViewMMFFile,sizeof(SPageFilePhysics));
I tested that and it worked like a charm. Also many thanks to the guy who wrote MMFAPP1 in the first place. It saved my neck. Also Richard thanks for your help as well.
|
|
|
|
|
Glad you got it sorted.
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
So am I!! Thanks again for your help
|
|
|
|
|
Hi I need to create edit control on frame window.
please suggest to do so?
|
|
|
|
|
|
I already answered that in reply to CEditCtrl in FrameWnd:
Frame windows do not contain user controls. Those should be part of views which in turn are hosted by frame windows.
|
|
|
|
|
You could use CEdit::Create method.
However, as already mentioned, there is rarely or maybe not at all a good idea to create control in the frame window.
|
|
|
|
|
Is there possible to run CFile::Open in order to write a text file, inside C:\Program Files\ location, with administrator rights, even the application who call this are not started with administrator rights ?
|
|
|
|
|
There is no way. A running process can not get higher privileges.
All you can do is starting another process using ShellExecuteEx with the "runas" verb which usually shows the UAC prompt.
Another option is running your application with sufficient priviliges and drop those when no longer needed. See permissions - Dropping privileges in C++ on Windows - Stack Overflow[^].
See also the CP article Riding the Vista UAC elevator, up and down[^].
But I suggest to rethink your request. An application should not modify data in the Program Files directory tree. That should be only modified by installation and update processes. Windows provides common directories for application specific data (shared and per user).
|
|
|
|
|
Ok, understood. Thank you.
|
|
|
|
|
|