[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.c++

out of scope pointers in threads

uche

11/28/2008 6:51:00 PM

I am trying to send a pointer to the thread below; however, when the
thread gets executed, the pointer goes out of scope . How do I fix
it ?

int mywrite(char* id, int number_of_characters, char char_array)
{
HANDLE Producer;

DWORD ThId;

//global_char = char_array;

//create mutual exlusion for producer process to write into the
buffer

//create producer thread and start the function for inserting
characters
//mywriteTh is the entry point of the producer


ptr =new data;
ptr->character = char_array;
cout<<ptr->character<<endl;
ptr->id = id;
cout<<ptr->id<<endl;


Producer = (HANDLE) CreateThread (NULL, 0, mywriteTh,
reinterpret_cast<data> (ptr) , 0, &ThId); // i want to send the
pointer to this thread

cout<<ptr->id<<endl;

return 0;
}

DWORD WINAPI mywriteTh(data ptr)
{
//global_char is available here

DWORD tId = GetCurrentThreadId();


data *ptr_data = reinterpret_cast<data *>(ptr); // pointer is goes
out of scope


}
8 Answers

uche

11/28/2008 6:57:00 PM

0

On Nov 28, 10:51 am, uche <uraniumore...@hotmail.com> wrote:
> I am trying to send a pointer to the thread below; however, when the
> thread gets executed, the pointer goes out of scope . How do I fix
> it ?
>
> int mywrite(char* id, int number_of_characters, char char_array)
> {
> HANDLE Producer;
>
> DWORD ThId;
>
> //global_char = char_array;
>
> //create mutual exlusion for producer process to write into the
> buffer
>
> //create producer thread and start the function for inserting
> characters
> //mywriteTh is the entry point of the producer
>
> ptr =new data;
> ptr->character = char_array;
> cout<<ptr->character<<endl;
> ptr->id = id;
> cout<<ptr->id<<endl;
>
> Producer = (HANDLE) CreateThread (NULL, 0, mywriteTh,
> reinterpret_cast<data> (ptr) , 0, &ThId); // i want to send the
> pointer to this thread
>
> cout<<ptr->id<<endl;
>
> return 0;
>
> }
>
> DWORD WINAPI mywriteTh(data ptr)
> {
> //global_char is available here
>
> DWORD tId = GetCurrentThreadId();
>
> data *ptr_data = reinterpret_cast<data *>(ptr); // pointer is goes
> out of scope
>
> }

please note: change data* to LPVOID ... HOWEVER, THIS DOESN'T SEEM TO
DO THE TRICK! I STILL GET A POINTER THAT IS OUT OF SCOPE!

James Kanze

11/28/2008 7:47:00 PM

0

uche wrote:
> I am trying to send a pointer to the thread below; however,
> when the thread gets executed, the pointer goes out of scope .
> How do I fix it ?

What is "data"? Is it a data type, or a pointer to a data type?
You seem to use it both ways.

> int mywrite(char* id, int number_of_characters, char char_array)
> {
> HANDLE Producer;

> DWORD ThId;

> //global_char = char_array;

> //create mutual exlusion for producer process to write into the buffer
> //create producer thread and start the function for inserting characters
> //mywriteTh is the entry point of the producer

> ptr =new data;

OK, we have 'data' as a data type, and 'ptr' is, I suppose a
data*.

> ptr->character = char_array;

Again, what is char_array? Where does it come from?

> cout<<ptr->character<<endl;
> ptr->id = id;
> cout<<ptr->id<<endl;

> Producer = (HANDLE) CreateThread (NULL, 0, mywriteTh,
> reinterpret_cast<data> (ptr) , 0, &ThId); // i want to send the
> pointer to this thread

Anytime you need a reinterpret_cast for a function argument, you
should be asking yourself questions. If I understand the
interface description of CreateThread at MSDN (Microsoft seems
to go in a lot for obfuscated typenames), you don't need any
cast at all; just pass the pointer. (I'm guessing here that
LPVOID is a void*; where the L comes from, I don't know.)

> cout<<ptr->id<<endl;
> return 0;
> }

> DWORD WINAPI mywriteTh(data ptr)

And according to the documentation, this function must take a
void* (well, an LPVOID) as well, not a data. (The documentation
shows some __in as well. More obfuscation; I don't think it
means anything.)

> {
> //global_char is available here

> DWORD tId = GetCurrentThreadId();

> data *ptr_data = reinterpret_cast<data *>(ptr); // pointer is goes
> out of scope

Again, a reinterpret_cast is a no-no. You need a static_cast of
the void* to the exact type of the pointer that was converted to
void*, above.

> }

As for "going out of scope", of course the pointer goes out of
scope. But you're passing a copy of it to the thread, and the
memory it points to is still there.

--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Pete Becker

11/28/2008 9:12:00 PM

0

On 2008-11-28 14:47:04 -0500, James Kanze <james.kanze@gmail.com> said:

> (I'm guessing here that
> LPVOID is a void*; where the L comes from, I don't know.)

The L stands for LONG. It's from the days when Windows still exposed
the Intel segmented architecture, so there were SHORT and LONG variants
of pointers.

--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
Standard C++ Library Extensions: a Tutorial and Reference
(www.petebecker.com/tr1book)

Maic Schmidt

11/28/2008 10:26:00 PM

0


Your pointer seems to go "out of scope" because your procedure where you
declared the pointer ends,
and so its local variable stack is cleared.

Declare your data-pointer at class or global scope.

class SVDaemon
{
public:
void StartThread()
{
pointer = new MyData();
wndThread =
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)WindowThread,pointer,0,&threadId
);
}
private:
MyData* pointer;
DWORD threadId;
HANDLE wndThread;
static DWORD WindowThread(MyData* data);
};

Greetz
Maic

"uche" <uraniumore235@hotmail.com> schrieb im Newsbeitrag
news:c201d729-47c7-449f-9d11-62ac37d10255@a29g2000pra.googlegroups.com...
> On Nov 28, 10:51 am, uche <uraniumore...@hotmail.com> wrote:
> > I am trying to send a pointer to the thread below; however, when the
> > thread gets executed, the pointer goes out of scope . How do I fix
> > it ?
> >
> > int mywrite(char* id, int number_of_characters, char char_array)
> > {
> > HANDLE Producer;
> >
> > DWORD ThId;
> >
> > //global_char = char_array;
> >
> > //create mutual exlusion for producer process to write into the
> > buffer
> >
> > //create producer thread and start the function for inserting
> > characters
> > //mywriteTh is the entry point of the producer
> >
> > ptr =new data;
> > ptr->character = char_array;
> > cout<<ptr->character<<endl;
> > ptr->id = id;
> > cout<<ptr->id<<endl;
> >
> > Producer = (HANDLE) CreateThread (NULL, 0, mywriteTh,
> > reinterpret_cast<data> (ptr) , 0, &ThId); // i want to send the
> > pointer to this thread
> >
> > cout<<ptr->id<<endl;
> >
> > return 0;
> >
> > }
> >
> > DWORD WINAPI mywriteTh(data ptr)
> > {
> > //global_char is available here
> >
> > DWORD tId = GetCurrentThreadId();
> >
> > data *ptr_data = reinterpret_cast<data *>(ptr); // pointer is goes
> > out of scope
> >
> > }
>
> please note: change data* to LPVOID ... HOWEVER, THIS DOESN'T SEEM TO
> DO THE TRICK! I STILL GET A POINTER THAT IS OUT OF SCOPE!


James Kanze

11/29/2008 10:17:00 AM

0

On Nov 28, 10:11 pm, Pete Becker <p...@versatilecoding.com> wrote:
> On 2008-11-28 14:47:04 -0500, James Kanze <james.ka...@gmail.com> said:

> > (I'm guessing here that
> > LPVOID is a void*; where the L comes from, I don't know.)

> The L stands for LONG. It's from the days when Windows still
> exposed the Intel segmented architecture, so there were SHORT
> and LONG variants of pointers.

Interesting example of why you shouldn't use Hungarian
notation:-).

--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Hendrik Schober

11/30/2008 11:54:00 AM

0

James Kanze wrote:
>
> [LPVOID]
>
> Interesting example of why you shouldn't use Hungarian
> notation:-).

But this isn't HN. ('lpvMyPtr' would be.)

Schobi

Pete Becker

11/30/2008 2:46:00 PM

0

On 2008-11-30 06:53:48 -0500, Hendrik Schober <spamtrap@gmx.de> said:

> James Kanze wrote:
>>
>> [LPVOID]
>>
>> Interesting example of why you shouldn't use Hungarian
>> notation:-).
>
> But this isn't HN. ('lpvMyPtr' would be.)
>

Well, yes, but Microsoft certainly promoted it as Hungarian Notation,
despite Charles Simonyi's disclaimers.

--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
Standard C++ Library Extensions: a Tutorial and Reference
(www.petebecker.com/tr1book)

Hendrik Schober

11/30/2008 6:18:00 PM

0

Pete Becker wrote:
> On 2008-11-30 06:53:48 -0500, Hendrik Schober <spamtrap@gmx.de> said:
>
>> James Kanze wrote:
>>> [LPVOID]
>>>
>>> Interesting example of why you shouldn't use Hungarian
>>> notation:-).
>> But this isn't HN. ('lpvMyPtr' would be.)
>>
>
> Well, yes, but Microsoft certainly promoted it as Hungarian Notation,
> despite Charles Simonyi's disclaimers.

I thought I knew the difference between Charles' idea (i.e
prefixing with meaning) and its application at MS (prefixing
with type). I hadn't thought that HN -- in the MS sense of
the word -- applied to types.

Schobi