|
Pegasus Kiddo wrote: #define vfor volatile
vfor variable;
#define vfor volatile
vfor variable;
I think this will do
regards
|
|
|
|
|
but that DOES use the volatile keyword, which Pegasus Kiddo don't want to...
hidding a word with another doesn't mean it is not used anymore... the compiler will see volatile as if it would have been written by the developer.
TOXCCT >>> GEII power [toxcct][VisualCalc]
|
|
|
|
|
ok, let's sum up.
what volatile is suposed to do ?
it is there to tell the compiler not to perform optimisations on the code it will generate because the variable marked as volatile may be modified from outside the process.
from the MSDN :
"Objects declared as volatile are not used in optimizations because their value can change at any time. The system always reads the current value of a volatile object at the point it is requested, even if the previous instruction asked for a value from the same object. Also, the value of the object is written immediately on assignment.
One use of the volatile qualifier is to provide access to memory locations used by asynchronous processes such as interrupt handlers."
do you see any point in the C++ language that allow you to perform such an action rounding over the volatile keyword ? no.
TOXCCT >>> GEII power [toxcct][VisualCalc]
-- modified at 8:09 Tuesday 29th November, 2005
|
|
|
|
|
toxcct wrote: do you see any point in the C++ language that allow you to perform such an action rounding over the volatile keyword ? no.
Actually yes. When you use a thread and you're sharing a variable, for instance.
class A
{
static bool bFlag;
void MethodA()
{
AfxBeginThread(&methodB,...);
Thread.Sleep(1000);
bFlag = false;
}
static UINT MethodB(LPVOID param)
{
while (!bflag)
{
...
}
}
}
might not work as expected, because the compiler can optimize away the while loop condition. The volatile keyword prevents that from happening.
Regards
Senthil
_____________________________
My Blog | My Articles | WinMacro
|
|
|
|
|
I suppose if you pass a variable by adress/reference to another function (outside the current compilation unit/module), the compiler is forced not to assume any optimization techniques regarding the variables value... Just an idea.
--
Pictures[^] from my Japan trip.
|
|
|
|
|
Hi,
I have an MFC application which talks to a DLL which talks to driver to send/receive data from a device.
When I send a command using the dllexport functions, I need the dllexport function to wait for a flag which will be set by the WndProc-OnDeviceChange function and dllexport funtion should return with some data which will be available after the flag is set.
I used a while loop in the dllexport functions checking for the flag and was setting the flag in WndProc assuming that the dllexport function and WndProc runs on different threads.
But this is not working. The application hangs.
Can you please suggest me another mechanism/logic to do this ?
- KK
|
|
|
|
|
When different threads r running and accessing a flag may cause collision.
You can use interlockedincrement or semaphore synchronization.
regards
|
|
|
|
|
Can you suggest any article where I can get a quick understanding of "interlockedincrement or semaphore synchronization" ?
- KK
|
|
|
|
|
Sleep is for the WEAK!!! Sorry too much caffeine.
Anyway, shout of thanks to Mr. Sivakumar for his help.
My new problem is grabbing the class out of the DLL. The assembly loads fine, but it doesn't seem to be finding the class inside the DLL. Here's the code:
a = Assembly::Load("LeetTrans");<br />
t = a->GetType("LeetTrans.LeetTrans");<br />
<br />
#pragma once<br />
#include "Wompi.h"<br />
#include "stdafx.h"<br />
#using <mscorlib.dll><br />
using namespace System;<br />
namespace LeetTrans<br />
{<br />
public __gc class LeetTrans : public Wompi<br />
{...}; <br />
}
I am watching the debugger and GetType never grabs the class. Do I need to put the class in the .DEF file somehow? A compiler option or property off maybe? I'm having trouble in general with the namespace and getting it to recognize the methods if I put them in a .cpp file so I feel like that may be where my problem is, but I can't figure it out. Any help is greatly appreciated. This site and everyone on it kicks ass. I just don't know why .NET hates me.
I am... the Warcow.
|
|
|
|
|
|
I figured it out. I was getting a null pointer exception on the Type. The namespace and class have to be in a .cpp file. It doesn't like headers for whatever reason. One of the readers of your article came across the same problem. It didn't hurt my code any to shift it all over to the one .cpp so I did. Thanks for all you're help though. The LoadLibrary/GetProcAddress method I was using would have taken me another 5 years to finish. It all runs, and runs like a dream. Speaking of dreams....
Sleep is for the WEAK!
|
|
|
|
|
I want to know, what are the typical differences between C++ Classes and Structures. All of us knows that, there is a main difference between the default visibility of parameters/methods [Private and Public]. Apart from this, are there any differences? Like memory allocations etc..
|
|
|
|
|
this question has been asked last week on the C++ forum (as it is a pure C++ question, it has nothing to do on the Managed C++ forum).
consider in basics that in C++, a struct is a class which default members are public...
see here[^]...
TOXCCT >>> GEII power [toxcct][VisualCalc]
|
|
|
|
|
Ok, my last post was just too big. I'll try to shorten it here. I'm trying to load DLLs dynamically using the LoadLibrary/GetProcAddress method. What I want to do is call a function in the DLL that creates an instance of the class I need. However I am getting an error:
System.Runtime.InteropServices.MarshalDirectiveException in Unknown Module
PInvoke Restriction: can not return variants
I'm not sure what is wrong, but it seems to be a problem with the variable.
The function looks like this:
Object __gc * __cdecl Build()<br />
{<br />
LeetTrans * a = new LeetTrans();<br />
return a;<br />
}
The head of LeetTrans looks like this:
public __gc class LeetTrans : public Wompi
And the head of Wompi looks like this:
public __gc class Wompi : public System::Windows::Forms::GroupBox
Now for the loader code,
typedef Object __gc * (__cdecl *Builder)();<br />
Builder build;<br />
FARPROC holder;<br />
Object __gc * wompi;
Here's where we cast the function and simply call the function to Wompi:
build = (Object __gc*(*)()) holder;<br />
wompi = build();
This is where our error occurs. So I'm guessing I'm losing the variable somewhere along the way, but I don't know where to begin. Any help would be greatly appreciated. Thank you.
-- modified at 18:23 Monday 28th November, 2005
|
|
|
|
|
Bobamagoo wrote: I'm trying to load DLLs dynamically using the LoadLibrary/GetProcAddress method.
If these are managed types, why don't you use reflection, which is the right way to do this?
|
|
|
|
|
I'm not sure exactly what you mean by reflection Mr. Sivakumar. Could you elaborate?
|
|
|
|
|
|
Wow.... thank you so much. I was REALLY doing things the long way. Now I might actually get to sleep tonight.... I'll also never have those 20 hours of my life back. But at least I'll get to sleep tonight.... mmm.... sleeeeeeeeep......
|
|
|
|
|
I have a Form and i have included:
public ref struct Language<br />
{<br />
String ^strFlagFile;<br />
String ^strLangFile;<br />
};
When i include any struct in same file as a form, then my VS2005 got error in design mode:
One or more errors encountered while loading the designer. The errors are listed below. Some errors can be fixed by rebuilding your project, while others may require code changes.
Where can i define struct to use in the Form.
ps: I hope that was clear. And Thanks in Advance
|
|
|
|
|
It's safer not to add code to the cpp/h files that are directly modified by the Forms designer. Try and declare your struct in a header file and #include it in your form file - that should help avoid this problem.
|
|
|
|
|
Hi,
I have a SDI app to which I need to add a second fixed toolbar positioned to the right of the first one. Does anyone know how to do this?
Thanks for any help,
Royce
|
|
|
|
|
Try this :
RecalcLayout();
CRect rect;
m_wndToolBar.GetWindowRect(&rect);
rect.left++;
DockControlBar(&m_wndToolBar2,AFX_IDW_DOCKBAR_TOP,rect);
|
|
|
|
|
Thanks, Nishant, for the help. However, the rect parameter is apparently ignored. This always docks the 2nd toolbar under the first one against the left frame border.
|
|
|
|
|
I'm just learning threading and have a question about the safety of calling functions from threads. This is more of a C question rather than C++ but here goes...
What would happen to this function if it was called from thread 01 with arguement 100, then 5 seconds later thread 02 calls it with arguement 101?
Would each thread get back the value it passed or would gremlins creep in and mess everything up?
int myFunction(int myInt)<br />
{<br />
int a = myInt;<br />
Sleep(10000);<br />
return a;<br />
}<br />
BTW... Yes i can try this myself and it seems to work for trivial examples... However is there any reason why it would/should/could not work.
Many thanks,
Daniel
-- modified at 18:40 Sunday 27th November, 2005
|
|
|
|
|
of course it works! Thread safety refers in general to sections of code accesing the same data. So in your case the data int a is internal to the function, thus, each instance of the function (each thread) will be operating on internal data. Your example wouldn't be thread safe if it were accessing let's say a variable int globalA defined outside the function such as:
<code>
int globalA;
int unsafeMyFunction(int myInt)
{
globalA = myInt;
Sleep(10000);
return globalA;
}
</code>
The example above is a quite simple one and you can find more information on the web about concurrency and race conditions and the ways to handle these situations and of course, the issues that arise from trying to avoid them.
|
|
|
|