|
How about:
char *str = "This is a test sample";
char sub[7] = {0};
strncpy(sub, &str[15], 6); or
memcpy(sub, &str[15], 6);
"When I was born I was so surprised that I didn't talk for a year and a half." - Gracie Allen
|
|
|
|
|
mid()
TOXCCT >>> GEII power
|
|
|
|
|
Hi
I'm designing a multiclient drawing board. There's a pencil. When you click (OnLButtonDown) on the pencil over an area, CPoints are added to a CPoint list(OnMouseMove), and when you release the mouse button (OnLButtonUp), a (-1,-1) is sent to the list.
I sent that, so that in the OnPaint function, LineTo's are called for every point of the list, and when you get a (-1,-1) it means that the line ends.
When you release the mouse button(OnLButtonUp), the list is sent to the other drawing board.
The problem is that while you are drawing (without release the mouse button), and the other person draws something, when he realeases the mouse button, the list is sent to the other person, and i don't want that to happen.
So i thought of CCritical Section. The drawing board, has the list of CPoints, and i wanted the board not to receive while you are drawing.
So i declared in the drawing board class:
CCriticalSection CritSect;
And in the OnLButtonDown, i call CritSect.Lock(), and in OnLButtonUp, i call CritSect.UnLock(), hoping that when you are drawing, a list wouldn't be inserted to your list when you are drawing. but that doesn't happen.
Do you have any ideas of what i'm doing wrong? perhaps the CCriticalSection approach is wrong.
thank you very much for your help!.
|
|
|
|
|
Depends on who your clients are and how they are calling into your program.
Do you have multiple threads running?
If no, then you need something more like a code for ownership, that is not a 'thread' protector. You can somehow identify your clients by a code, and then only allow the button down to assign a client to the list if no other client is using the list. And only respond to the button up if the client already owns the list.
|
|
|
|
|
it's only a thread.
The program is only one to one, there are only 2 clients connected at a time.
Blake Miller wrote:
only allow the button down to assign a client to the list if no other client is using the list. And only respond to the button up if the client already owns the list.
how could i do that?
|
|
|
|
|
If you can not identify your clients, you will never sort this out.
Suppose you have a variable called PointListOwner, and you can assign PLO_NONE, PLO_CLIENT_ONE, or PLO_CLIENT_TWO, then initially you set it to PLO_NONE.
Then, when you get the button down message, you figure out which client the message came from and assign the variable that client's identifier (assuming no client currently owns the list). Then when another button down message comes in, if it is not client who owns the list, ignore it. When a button up message comes in, then if it is not client who owns it, ignore it. If the button up is the client who owns list, then draw the lines and then set the owner back to none, so the other client, or the same one, can own the list on the next button down.
Since you only have one thread, no mutex, criticalsection, etc. is going to help you with blocking access.
I don't knwo how your server is accepting the client messages, but you need to factor in a mechanism for the messages to be associated with each client.
|
|
|
|
|
that could be what i'm looking for.. i'll see about it. thanks
|
|
|
|
|
Hi,
I would like to update the display in the CSTestView if the OK botton on CParaDlg is pressed, how to initiate the update?
void CParaDlg::OnOK()
{
CString msg = "checked";
AfxMessageBox(msg);
CDialog::OnOK();
}
void CSTestView::OnDraw()
{
}
I will be very appreciated for whatever hint I received.
Regards
Nelson L.
|
|
|
|
|
If you are using Doc/View architecture, you should call method UpdateAllViews() from your document object.
example:
GetDocument()->UpdateAllViews();
regards
Rodrigo Pinho Pereira de Souza
|
|
|
|
|
If this is normal dialog, you may check if it's closed with OnOK
void CSTestView::YourCallingFunction()
{
if(YourDlg.DoModal()==IDOK)
{
}
}
|
|
|
|
|
Hi,
Could anyone provide an example to get SID (Security Identificator) of local computer ?
Yours sincerely,
Alex Bash
|
|
|
|
|
A SID uniquely identifies a user or a group (i.e., a trustee). What makes you think the computer itself has one?
"When I was born I was so surprised that I didn't talk for a year and a half." - Gracie Allen
|
|
|
|
|
Hi there,
Can someone tell me how I can copy a file from one folder to another? I was told it was unwise to use the system() function because of security reasons.
Thanks!
|
|
|
|
|
|
Now why did I think it only works for Visual Basic? Thanks!
|
|
|
|
|
elephantstar wrote:
I was told it was unwise to use the system() function because of security reasons.
To say the least. It's also a holdover from the Unix days. Use CopyFile() as has already been mentioned, or SHFileOperation() .
"When I was born I was so surprised that I didn't talk for a year and a half." - Gracie Allen
|
|
|
|
|
|
Personally i dont like to use system() for anything
i would reccamend using the function CopyFile() http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/copyfile.asp or CopyFileEx() http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/copyfileex.asp
|
|
|
|
|
How to get rid of this warning?
conversion from 'long' to 'void *' of greater size
i have
void* d = (void*) pos;
'pos' is a long that has a value. After this, 'd' points to that address, it all works well but how can i get rid of the warning?
And since when is void* greater size than long? sizeof() says 4 bytes for both ((
|
|
|
|
|
Are you possibly doing:
long pos = 10;<br />
void* d = (void*)pos;
Instead of:
long pos = 10;<br />
void* d = (void*)&pos;
Bikram Singh
|
|
|
|
|
No, i dont want d to point to pos, i want it to point to the address stored in pos, in that case i would want d to point to address 10 in memory, my code is working as i like, but i cant get rid of warning
|
|
|
|
|
If you're sure of what you're doing, and just want to get rid of the warning, use the #pragma warning() directive.
Bikram Singh
|
|
|
|
|
I got it, it was the 64 bit portability warnings, i have to use LONG_PTR instead of longs to be ready for 64bit stuff
|
|
|
|
|
<font style="color:blue;">long </font>pos; <font style="color:green;">
<font style="color:blue;">void</font>* d = <font style="color:blue;">static_cast</font><<font style="color:blue;">void</font>*>(pos);
TOXCCT >>> GEII power
|
|
|
|
|
thats evil, the the compiler is telling you so. It almost works now, but it won't work (100% anyway) on 64 bit systems.
you shouldn't do
long pos = 10;
it should be
long *pos = (long *)10;
then you can do
void *d = pos;
which is legal.
If you can't change your code like the above, then the work around that others have come up with will work. Just make sure you comment why you had to do it incorrectly so I curse the idiot before you, and not you, when I come in two years from now to make the code 64 bit safe.
64 bit processors are coming. They have been around for more than 10 years, and are slowly making gains on the desktop. Already people are buying them and not knowing it. (though they are running a version of windows that doesn't support the 64 bit parts, eventially they will be running 64 bit windows and not know it)
|
|
|
|