Re: [osg-users] Openthreads problem on 64 bit windows system.

2008-05-28 Thread Adrian Egli OpenSceneGraph (3D)
Hi nelson,

i remeber a problem i got long time ago with openthreads and windows, even
on a 32 bit system. i located that we go an issue on windows system with the

sleep method. (windows native).

so can you try following:

(1) replace the microsleep with the
OpenThreads::Thread::YieldCurrentThread()
 report what happens

(2) replce the microsleep only in the Thread class / method with
YieldCurrentThread
 report what happens

if both test are also negative, then replace microsleep with
void millisleep( unsigned int milliseconds )
{
# ifdef _MSC_VER   // If its Visual C++ call Win32 Sleep function
   ::Sleep( milliseconds);
#else  // Else assume a UNIX/Linux system with nanosleep function
   timespec ts;
   ts.tv_sec = milliseconds / 1000;
   ts.tv_nsec = (milliseconds - ts.tv_sec*1000) * 100;
   ::nanosleep(ts, NULL);
# endif
}
what happens ?


Have also a look into:
and search in google with adrian egli / openthreads / sleep
http://www.openscenegraph.org/projects/osg/changeset/5313



2008/5/28 Cysneros, Nelson SPAWAR [EMAIL PROTECTED]:



 I'm having a problem with an existing application that runs well on a
 32-bit windows XP (VS 2003) system, but does not seem to work when ran
 on a 64-bit windows XP (VS 2003) system.

 I narrowed down the problem to Openthreads, seems that my threaded while
 loop never (or rarely) gets called.  I was able to recreate the problem
 with this simple program below. It runs two threads, both printing a
 message to the screen.  Only one message is displayed on a 64bit
 machine.  I turned on OSG notification to DEBUG, but no extra
 information is displayed.

 Has anyone else experience this problem?  Am I doing something wrong?
 Thanks in advance.


 ///
 //Header file MutexTest.h
 ///
 #ifndef __MUTEXTEST_H_
 #define __MUTEXTEST_H_

 #include OpenThreads/Thread
 #include OpenThreads/Mutex
 #include OpenThreads/Barrier
 #include OpenThreads/Block
 #include OpenThreads/ScopedLock
 #include iostream

 class MutexTest : public OpenThreads::Thread
 {
  public:
  MutexTest();
  ~MutexTest();
  //Functions
  virtual void run();
  void quit();
  void printHello();
  void setMutex(OpenThreads::Mutex* newValue);
  OpenThreads::Mutex* getMutex();

  private:
mutable OpenThreads::Mutex*  _mutex;
  };
 #endif


 ///
 //Source file MutexTest.cpp
 ///

 #include MutexTest.h

 MutexTest::MutexTest(){
_mutex = new OpenThreads::Mutex();
 }

 MutexTest::~MutexTest(){
std::coutMutexTest Test Shuting
 down.std::endl;
 }

 void MutexTest::setMutex(OpenThreads::Mutex* newValue){
_mutex = newValue;
 }

 OpenThreads::Mutex* MutexTest::getMutex(){
return _mutex;
 }

void MutexTest::quit() {

}

void MutexTest::printHello(){
OpenThreads::ScopedLockOpenThreads::Mutex
 lock(*_mutex);
std::cout-- Mutex Class: Hello --std::endl;
}

void MutexTest::run() {
   while(true){


 //
   //This only gets called once when running on 64bit
 system

 /
printHello();
//sleep
OpenThreads::Thread::microSleep(5000);
}//while
}//run

 //
 
 ---
 //
 //   main
 //
 //
 
 ---
 int main(int argC, char* argV[])
 {
//Create a mutex we can share
OpenThreads::Mutex* mutable my_mutex = new OpenThreads::Mutex;
MutexTest* testMutex = new MutexTest();
testMutex-setMutex(my_mutex);

//Start thread
testMutex-start();

while(true)
{
OpenThreads::ScopedLockOpenThreads::Mutex
 lock(*my_mutex);
std::cout Main: Hello std::endl;
//sleep
OpenThreads::Thread::microSleep(2000);

}//while
return 0;
 }//main
 ___
 osg-users mailing list
 osg-users@lists.openscenegraph.org
 http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org




-- 

Adrian Egli
___
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org


Re: [osg-users] Openthreads problem on 64 bit windows system.

2008-05-28 Thread Robert Osfield
Hi Guys,

This sounds like a problem in the thread scheduler under WindowsXP
64bit, something you'll probably just have work around rather than be
able to fix it via mods to OpenThreads side.

As an experiment try setting the processor affinity on each of the
threads so that they are on different cores, this might give the
scheduler more of hint of what to do and where.

And if you have a choice of OS, perhaps WindowsXP 64 ain't the best in
the world to go for...

Robert.

On Wed, May 28, 2008 at 7:40 PM, Cysneros, Nelson SPAWAR
[EMAIL PROTECTED] wrote:
 Thank you for the suggestions.  Here are the results:

 (1) replace the microsleep with the
 OpenThreads::Thread::YieldCurrentThread()
  report what happens

 Works a little better. seems to stay on one thread for about a minute or so
 and then jump to the next thread  for about a minute and repeats.
  Still not what I was expecting where the thread jumps back and forth
 without delay.

 (2) replce the microsleep only in the Thread class / method with
 YieldCurrentThread
  report what happens
 About the same as #1, but the time in each thread seems to last a lot
 longer.  Probably due to the microsleep time.

 if both test are also negative, then replace microsleep with
 void millisleep( unsigned int milliseconds )
 {
 # ifdef _MSC_VER   // If its Visual C++ call Win32 Sleep function
::Sleep( milliseconds);
 #else  // Else assume a UNIX/Linux system with nanosleep function
timespec ts;
ts.tv_sec = milliseconds / 1000;
ts.tv_nsec = (milliseconds - ts.tv_sec*1000) * 100;
::nanosleep(ts, NULL);
 # endif
 }
 what happens ?

 Seem to behave as the original application did, where only one thread is
 being called.  I did however use System::Threading::Thread::Sleep instead of
 ::Sleep in order to compile.

 I'll take a look at the links you send and report back if I get it solved.

 Thanks again for your help.  :)

 -Original Message-
 From: [EMAIL PROTECTED]
 [mailto:[EMAIL PROTECTED] On Behalf Of Adrian Egli
 OpenSceneGraph (3D)
 Sent: Tuesday, May 27, 2008 11:31 PM
 To: OpenSceneGraph Users
 Subject: Re: [osg-users] Openthreads problem on 64 bit windows system.

 Hi nelson,

 i remeber a problem i got long time ago with openthreads and windows, even
 on a 32 bit system. i located that we go an issue on windows system with the
 sleep method. (windows native).

 so can you try following:

 (1) replace the microsleep with the
 OpenThreads::Thread::YieldCurrentThread()
  report what happens

 (2) replce the microsleep only in the Thread class / method with
 YieldCurrentThread
  report what happens

 if both test are also negative, then replace microsleep with
 void millisleep( unsigned int milliseconds )
 {
 # ifdef _MSC_VER   // If its Visual C++ call Win32 Sleep function
::Sleep( milliseconds);
 #else  // Else assume a UNIX/Linux system with nanosleep function
timespec ts;
ts.tv_sec = milliseconds / 1000;
ts.tv_nsec = (milliseconds - ts.tv_sec*1000) * 100;
::nanosleep(ts, NULL);
 # endif
 }
 what happens ?


 Have also a look into:
 and search in google with adrian egli / openthreads / sleep
 http://www.openscenegraph.org/projects/osg/changeset/5313



 2008/5/28 Cysneros, Nelson SPAWAR [EMAIL PROTECTED]:


 I'm having a problem with an existing application that runs well on a
 32-bit windows XP (VS 2003) system, but does not seem to work when ran
 on a 64-bit windows XP (VS 2003) system.

 I narrowed down the problem to Openthreads, seems that my threaded while
 loop never (or rarely) gets called.  I was able to recreate the problem
 with this simple program below. It runs two threads, both printing a
 message to the screen.  Only one message is displayed on a 64bit
 machine.  I turned on OSG notification to DEBUG, but no extra
 information is displayed.

 Has anyone else experience this problem?  Am I doing something wrong?
 Thanks in advance.


 ///
 //Header file MutexTest.h
 ///
 #ifndef __MUTEXTEST_H_
 #define __MUTEXTEST_H_

 #include OpenThreads/Thread
 #include OpenThreads/Mutex
 #include OpenThreads/Barrier
 #include OpenThreads/Block
 #include OpenThreads/ScopedLock
 #include iostream

 class MutexTest : public OpenThreads::Thread
 {
  public:
  MutexTest();
  ~MutexTest();
  //Functions
  virtual void run();
  void quit();
  void printHello();
  void setMutex(OpenThreads::Mutex* newValue);
  OpenThreads::Mutex* getMutex();

  private:
mutable OpenThreads::Mutex*  _mutex;
  };
 #endif


 ///
 //Source file MutexTest.cpp
 ///

 #include MutexTest.h

 MutexTest::MutexTest(){
_mutex = new OpenThreads::Mutex();
 }

 MutexTest::~MutexTest(){
std::coutMutexTest Test Shuting
 down

[osg-users] Openthreads problem on 64 bit windows system.

2008-05-27 Thread Cysneros, Nelson SPAWAR


I'm having a problem with an existing application that runs well on a
32-bit windows XP (VS 2003) system, but does not seem to work when ran
on a 64-bit windows XP (VS 2003) system.  

I narrowed down the problem to Openthreads, seems that my threaded while
loop never (or rarely) gets called.  I was able to recreate the problem
with this simple program below. It runs two threads, both printing a
message to the screen.  Only one message is displayed on a 64bit
machine.  I turned on OSG notification to DEBUG, but no extra
information is displayed.

Has anyone else experience this problem?  Am I doing something wrong?
Thanks in advance.


///
//Header file MutexTest.h
///
#ifndef __MUTEXTEST_H_
#define __MUTEXTEST_H_

#include OpenThreads/Thread
#include OpenThreads/Mutex
#include OpenThreads/Barrier
#include OpenThreads/Block
#include OpenThreads/ScopedLock
#include iostream

class MutexTest : public OpenThreads::Thread
{
  public:
  MutexTest();
  ~MutexTest();
  //Functions
  virtual void run();
  void quit();
  void printHello();
  void setMutex(OpenThreads::Mutex* newValue);
  OpenThreads::Mutex* getMutex();

  private:
mutable OpenThreads::Mutex*  _mutex;
  };
#endif


///
//Source file MutexTest.cpp
///

#include MutexTest.h

MutexTest::MutexTest(){
_mutex = new OpenThreads::Mutex();
}

MutexTest::~MutexTest(){
std::coutMutexTest Test Shuting
down.std::endl;
}

void MutexTest::setMutex(OpenThreads::Mutex* newValue){
_mutex = newValue;
}

OpenThreads::Mutex* MutexTest::getMutex(){
return _mutex;
}

void MutexTest::quit() {

}

void MutexTest::printHello(){
OpenThreads::ScopedLockOpenThreads::Mutex
lock(*_mutex);
std::cout-- Mutex Class: Hello --std::endl;
}

void MutexTest::run() {
   while(true){


//
   //This only gets called once when running on 64bit
system

/
printHello();
//sleep
OpenThreads::Thread::microSleep(5000);
}//while
}//run

//

---
//
//   main
//
//

---
int main(int argC, char* argV[])
{
//Create a mutex we can share
OpenThreads::Mutex* mutable my_mutex = new OpenThreads::Mutex;
MutexTest* testMutex = new MutexTest();
testMutex-setMutex(my_mutex);  

//Start thread
testMutex-start();

while(true)
{
OpenThreads::ScopedLockOpenThreads::Mutex
lock(*my_mutex);
std::cout Main: Hello std::endl;
//sleep
OpenThreads::Thread::microSleep(2000);

}//while
return 0;
}//main
___
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org