|
Yes,
its a question of looking inwards, not outwards....
I was doing nothing in the the OnReceive that I thought could create a problem but it was an unguarded CPtrList.AddTail followed a little later (in same procedure) with a CPtrList.RemoveHead. Guarding these with a CSingleLock fixed the problem...
Though I don't see why that should be necesary as only references to this list are these two in this function, and this function is only ever called as the OnReceive on this single socket in its own thread.... unless WinSock can generate multiple (overlapping) calls? Is that possible?
many thanks
Rod.
|
|
|
|
|
EvoWing wrote: and this function is only ever called as the OnReceive on this single socket in its own thread
What do you mean "its own thread"?
By default, OnReceive() is called on the UI thread.
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Ok my code is below, my program is working okay so far but I am trying to implement the concatenate function and I have no clue how to do so. I am passing the second list to the concatenate function but I am unsure of how to create a pointer that would point to the first node of that second list object. I have a pointer created that points to the fist node of the first list but I don't know how to make one for the second list. How do I do this?
#ifndef NEWSTRING_H_INCLUDED
#define NEWSTRING_H_INCLUDED
struct Newlist
{
char data;
Newlist *next;
};
class listClass
{
public:
listClass();
~listClass();
void insert(char);
void display();
int length();
void concatenate(listClass);
void concatenate(char);
bool substring(Newlist);
private:
Newlist *head;
Newlist *current;
};
#endif // NEWSTRING_H_INCLUDED
#include <iostream>
#include "Newstring.h"
using namespace std;
listClass::listClass()
{
head = NULL;
}
listClass::~listClass()
{
if(head != NULL)
{
do
{
Newlist *nodePtr = head;
head = head->next;
delete nodePtr;
} while(head!=NULL);
}
}
void listClass::insert(char value)
{
Newlist *insert, *temp;
insert = new Newlist;
insert->data = value;
insert->next = NULL;
if(head == NULL)
{
head = insert;
current = head;
}
else
{
temp = head;
while(temp->next != NULL)
{
temp = temp->next;
}
temp->next = insert;
}
}
void listClass::display()
{
Newlist *displayPtr;
displayPtr = head;
while(displayPtr != 0)
{
cout << displayPtr->data << endl;
displayPtr = displayPtr->next;
}
}
int listClass::length()
{
Newlist *countPtr;
int count = 0;
countPtr = head;
while(countPtr != NULL)
{
count++;
countPtr = countPtr->next;
}
return count;
}
void listClass::concatenate(listClass newlist)
{
insert(newlist);
}
#include <iostream>
#include "Newstring.h"
using namespace std;
int main()
{
listClass list;
listClass newlist;
list.insert('a');
list.insert('b');
list.insert('c');
list.display();
cout << list.length() << endl;;
newlist.insert('d');
newlist.insert('e');
newlist.insert('f');
list.concatenate(newlist);
list.display();
return 0;
}</iostream></iostream>
|
|
|
|
|
Sadaiyappan wrote: I am trying to implement the concatenate function and I have no clue how to do so.
There are two ways, depending on how you want concatenate() to work. If you want to copy the data from your second list and append it to the end of the first list, simply traverse the second list, extract the value and use your insert() method to append the data to the first list.
If your intention is to link the two lists together, simply find the last *next pointer in your first list and point it to the head of the second list.
Some notes on your code: When traversing your lists, sometimes you compare against NULL and sometimes you compare against 0. Keep it consistent. It's probably better to always use NULL.
Your insert() method isn't really an insert method. It is an append method. It always adds the record to the end of the list. It makes more sense (to me, at least) that the insert() method should add the record just before your NewList *current pointer.
Also, your class maintains a *current pointer which will never point to anything other than *head (i.e. it's only set in insert() ). *current should probably be used to keep track of the current read position in your linked list so your users can actually use the list. You need a getData() method and a next() method which would allow users to read a record and move to the next record in the list. You should also include a rewind() method to set the *current pointer back to the beginning of the list.
|
|
|
|
|
I am creating application to track the usage of Function keys in the system. For that purpose i installed a system wide hook. The program also have an interface which the user can configure various settings . The hook is installed in the InitDialog of this dialog. User can also minimize the dialog to system tray. The problem is that the hook works only when the dialog is visible. If the user minimizes the app to the system tray the hook stops processing messages.
extern "C"
__declspec(dllexport) void InstallHotkeyHook()
{
hHotkeyHook = SetWindowsHookEx(WH_KEYBOARD, HotkeyMessageProc, hMod, 0);
}
The above function is called to install the hook from InitDialog.
Please help.
I am using VS6.0 and OS is WinXP SP2
Regards,
John
|
|
|
|
|
How does the HotkeyMessageProc() looks like? And how did you confirm that the call back function is not getting called when minimized...
|
|
|
|
|
Thanks for the reply.
I put a BP in the hook function..It only got breaked when i had focus on the dialog.
LRESULT CALLBACK HotkeyMessageProc(int code, WPARAM wParam, LPARAM lParam)
{
if (code > 0) return CallNextHookEx(hHotkeyHook, code, wParam, lParam);
:
:
:
}
|
|
|
|
|
When you install a global hook, the hook function is executed in each process context. That is all the process which is affected by the hook loads the hook dll and call this function in its context.
But in your your setting the break point in you application. So the break point will hit only while your applciation executes the hook procedure.
Put a mesasgebox in the hook procedure and then try...
|
|
|
|
|
emmmatty1 wrote: The hook is installed in the InitDialog of this dialog.
How will it work then? You are expecting to install a global keyboard hook - So, the hook should be installed from within a system-wide DLL, so that it could continue to process the hook messages. If it were installed from within a dialog which is not system-wide, and would work only when the dialog thread is active.
Try this:
Step 1. Create a DLL and write the hook procedure in the DLL.
#pragma data_seg(".SHARED")
static HHOOK hKeyBD=NULL;
#pragma data_seg()
#define DLLEXPORT __declspec(dllexport)__stdcall
HINSTANCE hInst;
LRESULT DLLEXPORT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (((DWORD)lParam & 0x40000000) && (HC_ACTION==nCode))
{
}
return CallNextHookEx(hKeyBD, nCode, wParam, lParam);
}
BOOL DLLEXPORT StartHook()
{
hKeyBD=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc, hInst, 0);
return TRUE;
}
BOOL DLLEXPORT StopHook()
{
BOOL bStatus = UnhookWindowsHookEx(hKeyBD);
return bStatus;
}
BOOL CHodllApp::InitInstance()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
hInst=AfxGetInstanceHandle();
return TRUE;
}
Step 2. Start the hook from an external module and stop it when you're done. Write back if you have troubles doing this.
Many are stubborn in pursuit of the path they have chosen, few in pursuit of the goal - Friedrich Nietzsche
.·´¯`·->Rajesh<-·´¯`·.
[Microsoft MVP - Visual C++]
|
|
|
|
|
For the life of me I can't work this out.
In the "apps" InitInstance I seed the random number generator by calling srand(time(NULL));
Then in a thread whenever I invoke rand() and print it out via cout it always has the value of 18467. Now rand() is invoked every minute or two so it's not like it's in a tight loop or anything like that. I never call srand again either. Just the once in the apps InitInstance function.
Anyone experienced this problem before? Currently using Visual Studio 2008. I even went so far as to apply SP1 to it just incase something was fixed. Such a simple thing not working is really annoying me.
Just to add if I print out rand() a few times in the apps InitInstance it works as expected. However once I call it from a UI thread it's always the same number.
modified on Monday, September 1, 2008 3:30 PM
|
|
|
|
|
jbem wrote: In the "apps" InitInstance I seed the random number generator by calling srand(time(NULL));
jbem wrote: Then in a thread whenever I invoke rand()
srand() is thread specific. You need to seed (call srand())
on every thread that will call rand().
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Thanks. That did the trick.
|
|
|
|
|
Hi i am new to the concepts of vc++.
In my application i used a dropdown box where the user cab either pick the value from the dropdown or enter his own choice,after entering the value if the user is hitting the enter button my application is closing
i used the follwoing code in my pretranslate msg it is woking fine for all other controls except this dropdown box
if (pMsg->wParam == VK_RETURN)
{
//Call events on enter
PostMessage(WM_COMMAND, (BN_CLICKED << 16) | GetFocus()->GetDlgCtrlID(),(ULONG)GetDlgItem(GetFocus()->GetDlgCtrlID())->m_hWnd);
}
Can anybody suggest me the right approcah for doing this....
Thanks in advance..
|
|
|
|
|
|
if (pMsg->message == WM_KEYDOWN)
{
if (pMsg->wParam == 13)
{
return TRUE;
}
}
|
|
|
|
|
Hello. I have worked on some 2D development but now I am heading into 3D development and was wanting to create a virtual world but I really dont know how to. I would be grateful if someone could help me. If you want more information about the project I will be happy to tell you.
Thank you very much.
Andrew
|
|
|
|
|
That's not a trivial task. The easiest solution is to use an existing 3D engine: Irrlicht, Ogre3D, OpenSceneGraph, ...
The first two ones are targeted specifically for games. So I would suggest the last one (see here[^]). I never used it myself but I heard good things about it.
You could of course develop the 3D engine yourself but looking at your question, it will probably be very difficult.
|
|
|
|
|
Thanks for the quick reply. I have decided not to use a 3D engine for different reasons. I have already scripted a lot of files but now its the stage of scripting the source code. I have used the 3d engine for other projects but now I want to build it using my own source code with some help.
|
|
|
|
|
Well, then you will need to learn either OpenGL or DirectX, then learn how to render 3D scene (I suggest a good book on that because you will spend probably too much time if you have to search for that on the web) and also probably some math. Anyway, this can't simply be answered on a forum because it is really big.
MrMcIntyre wrote: I have already scripted a lot of files but now its the stage of scripting the source code.
What do you mean by 'scripting'
|
|
|
|
|
See when I have finished learning OpenGL or DirectX what will be the next stage.
|
|
|
|
|
MrMcIntyre wrote: See when I have finished learning OpenGL or DirectX what will be the next stage.
learn what a scene graph is, and how to write your own. I use open scene graph for a lot. One advantage is that I have written my own "back in the day." I understand the desire to learn from the inside out and I commend you for the desire. Study how the various scene graphs work, their advantages and disadvantages and how you want to style your own. In the end it helps you understand why the various groups made the decisions they did. It may help you keep your own, or choose one of the existing groups and support them. In the end I chose OSG, but I can do more with it because I understand it internally.
Good luck!
_________________________
Asu no koto o ieba, tenjo de nezumi ga warau.
Talk about things of tomorrow and the mice in the ceiling laugh. (Japanese Proverb)
John Andrew Holmes "It is well to remember that the entire universe, with one trifling exception, is composed of others."
|
|
|
|
|
I meant programming sorry about that.
|
|
|
|
|
I have download OpenSceneGraph and had a look around the website and I am really amazed at what you can use the software for game, virtual reality and more. Now I have the enviournement maker, is it now down to the source code.
|
|
|
|
|
Hi guys,
I have a dialog box on mfc and put a picture control onto it.
Now it is no problem to load images from a path of my harddisk, they are shown well.
But i dont know, how to load BITMAPS dynamically into the control.
First I create a new Bitmap with the CreateBitmap() function from a Byte-Array.
The function returns a non-zero value, so it was successfull.
But now i have somehow to copy that bitmap into a memory-hdc, and from there
i should be able to load it into the control. but i dont get it!!!
I added a variable to the control from the type CStatic.
But why is it so complicated, to get that created HBITMAP onto the Control?
I mean, there IS a CStatic-function, which lets me SetBitmap(HBITMAP hBitmap)...
But it does not work!!!
I hope someone can help me...
Best regards,
cherry
|
|
|
|
|
Hi,
I don't think there's an easy answer to your question. I do not known what is wrong in what you did with the code. But, did you had a look into these articles?
1) Chris Maunder's DIBSection wrapper[^]
2) Chris Maunder's auto-sizing bitmap control[^]
3) Troels Knakkergaard's Drawing transparent bitmaps[^]
It might give you the clue you need it to figure out where the real problem is...
Best regards,
Mihai Moga
|
|
|
|