yes it belongs in tips but I also have a little tip for you.
memmove from the C/C++ standards library can deal with source and destination memory overlapping and it can do it with no extra buffers at all.
So you really only need the string search parts of your code and then use memmove to do the shuffle replacing the memcpy's
memmove[^] memmove ensures that the original source bytes in the overlapping region are copied before being overwritten.
memmove from the C/C++ standards library can deal with source and destination memory overlapping and it can do it with no extra buffers at all
I know it. But I can not implement memmove() to my task. memmove() will ovewrite some part of my buffer (or I have to use temporary buffer to store that part) so I'll loose some data. Perhaps there is a way to use it, but I do not yet know how.
you really only need the string search parts of your code
char * buffer = "World!Hello, ";
It was only the small example to illustrate what I meaning under "buffer scrolling" term. In real code I have more that 100Mb binary (non-text) raw data which I have got from external device.
I do not know (in advance) the size, and I do not know the move distance.
Use any boost or Qt libraries. They both offer networking capabilities for your applications, that you can use and build the apps that support networking features. Server and clients are just the applications that either take control of communication, or are guests. Network Examples | Qt Network 5.9 see this for examples on this. They might have something as a working sample, but you will still require some tweaks.
One thing, do not go onwards toward ACE framework — it is just painful, I am currently trying to get it to work and say hello, but it does not even work at all. If someone ever offers you the code, just away from it.
"the debugger doesn't tell me anything because this code compiles just fine" - random QA comment
"Facebook is where you tell lies to your friends. Twitter is where you tell the truth to strangers." - chriselst
"I don't drink any more... then again, I don't drink any less." - Mike Mullikins uncle
You probably don't need an array class if you just want to copy data and do not need inserting or removing of items. If you know the (max.) size in advance just use a plain array allocated with new. If not, you can still grow by allocating a new array, copying data from the old, and delete the old.
CByteArray is also an MFC class which is probably also not thread safe. But it is impossible to help without knowing what your code is doing.
The question are (you may ask and solve them yourself):
Does my array require special modification functions besides copying?
Which functions use my array under which conditions (read only, write only, both)?
Where is may array allocated (this might be at different code points if resizing is necessary)?
Where it is deleted?
Do I need thread safety?
I'm reading this excellent book. I considered to use steering behavior in our MMORPG game server project.
but if we use it all,it would consume a lot of cpu time which would be unacceptable for a server project.
does any one have any experience on this topic?How could I find a proper way to use steering behavior in MMORPG server?
You write the search algorthim as an iteration, with adjustable resolution and trigger(s).
If two objects are more than X apart the search doesn't run at all unless there is a special trigger. If you haven't been "spotted" there is no need for an enemy to search and so they usually just walk a defined set of waypoints called "pathing".
So movement especially for NPC's or bots usually have two different behaviours being "pathing" and "searching". Often there is also a way to get "unspotted" and NPC's/BOTs may be leashed to some co-ordinate. If they get more than some distance from the leash point they will drop "seaching" behaviour and resume "pathing".
The trigger whatever that is usually establishes the "target" and it is at that point the search AI kicks in. The game design thus far made sure searching is used sparingly.
Now when the search algorthim kicks in, it sets a resolution grid based upon how far the target is away. You don't need a fine grid for a target far away. So you will have a raycast which you run to each point on the grid. So when target is a long way away you still only get a small grid just they represent a big distance. That is the bit your code you currently have probably doesn't do and so you have a huge grid when the target is a long way away.
So now with your grid you run the AI search algorthim to work out what direction to move to the target allowing for walls etc. If the target is a long way away the direction will only be rough but that is all it needs it will fine up as it gets closer.
The problem you probably have with the AI search they have given you is the grid is massive and it gets bigger and bigger the further a target is away.
I don't know how to do what you want with heap but there is an obvious way to make the program more deterministic which is to pre-create the dialogs just held in a storage array not in use. It is really dangerous to be creating anything so significant off an event.
When you get a message you call your little routine to pass you back the first free dialog which you load and use. When it's finished you put it back in the pool.
It's a lot easier to avoid such problems by changing behaviour to determinstic rather than chase the bug itself
That is how windows is designed to work. The best bit if you don't use the HasString flag you can just send the pointer in to the text which saves copying and moving the text.
If you have a dialog coming up a lot you are expected to do it that way or via the dialog template system so you don't fragment the hell out of the memory. Common dialogs works that way you know FileOpen, FileSave etc. CreateDialogIndirect function (Windows)[^] Creates a modeless dialog box from a dialog box template in memory
All you have to do is insert your changes to the text etc via the message system using the control ID's, put it into the desktop or your app and then set the dialog modal and viola it looks just like what you are doing now.
I don't have a problem creating the odd dialog on the fly but if it comes up a lot try and at least use windows the way it was intended.
The debug thing uses a similar trick but into a multiline text window. They change the malloc stub to post the text messages to the multiline edit window.
dlg.DoModal(); // tadaaa! this is the line everyone's been waiting for!!!
I loved the tadaa in the source comments and it's because at that moment the penny should drop that the template has just been sitting in memory and wont do anything until you execute those two lines. It's much kinder on windows especially in a threaded app and less chance of making mistakes.
So when you get the message from your ethernet port all you have to do is execute those two lines and dialog flies out of memory and up on screen. You can actaully do everything else before that any earlier time.
Not sure how MFC does this but there is an lParam value that is part of the indirect and usually you pass a struct with your data you want loaded in the dialog handler in as well. It saves having to carry a global with your data.In your case I would imagine it would be a pointer to your payload data recieved. Again saves copy or moving any data.
It stuns me dlg.InitModalIndirect doesn't take a second parameter which is what I was expecting and where you would pass in your data pointer. So bit of mystery to me how you do that under MFC. Oh I wonder does dlg.InitModalIndirect have overrides and used as a shim on the indirect call to cater for that. In which case there will be a form of that you can pass a second parameter on.
Yes any dialog or window can be created from templates. The window one usually catches even seasoned programmers out. If you look at the template call CreateDialogIndirectParam the DLGPROC is optional. What you do is pass in the window handler and use setwindowlong to put it onto the modeless dialog which just happens to have all the style flags of a window. Once it has the handler attached you can just insert it into any APP window or even the desktop because it's a normal window and so you fake CreateDialogIndirectParam returning a fail. Did you notice it's up to you to call DestroyWindow and that is why they don't do it automatically. Sometimes it's useful to lie to the API
Yes its a template you can launch multiple copies as it only gets read and all global alloc memory is thread safe. It can't write or move anything as you usually only allocate just enough space to hold the resource. I assume that all still holds true for MFC. Officially the GlobalAlloc etc is now "old" but they have not got around to giving us replacement template system.
Most windows programmers are familiar with LoadResource and loading bitmap/icons/menus etc because they are going to draw them on screen alot but using the system for dialogs and windows usually escapes them because they don't need the response of a window like in your example.
The heap corruption indicates that you have an out of bound memory write access (e.g. writing to an array beyond it's size). Running out of memory indicates that you are allocating a lot of memory but not freeing it.
For modeless dialogs follow these adviceses:
Create a variable and initialise it (assigning NULL or using new)
When the dialog should be created the first time check if the variable is NULL and call new if so
Create the dialog
When finished with the dialog, call DestroyWindow()
If the allocated memory is not needed anymore, delete it and assign NULL to the variable
When the variable goes out of scope, delete the memory (e.g. in the destructor of the class holding the variable)
I suggest to check your code for the above (each new must have a corresponding delete, and each CDialog::Create must have a corresponding CDialog::DestroyWindow).
Because the memory corruption is a severe error, I suggest to find the source and fix it first. Use a debug build. Then you don't need the GFlags. They are for debugging executable files where you don't have the sources.
If you know the code portions (or have a guess) where the heap corruption occurs, you can insert some AfxCheckMemory[^] calls to check the C++ heap.
it is after do the create of the dialog and populate the control including allocating via new a Richedit and streaming data to it that something goes wrong all storage is allocated via new
A common error for such cases is forgetting to append a NULL char to the received data before passing them as string and/or forgetting to allocate the additional memory for the NULL char.