⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cxx

📁 pwlib源码库
💻 CXX
字号:
#include <ptlib.h>#include <string>//////////////////////////////////////////////////// test #1 - string concurrency test//#define SPECIALNAME     "openH323"#define	COUNT_MAX	2000000BOOL finishFlag;template <class S>struct StringConv {  static const char * ToConstCharStar(const S &) { return NULL; }};template <class S, class C>class StringHolder{  public:    StringHolder(const S & _str)      : str(_str) { }    S GetString() const { return str; }    S str;    void TestString(int count, const char * label)    {      if (finishFlag)        return;      S s = GetString();      const char * ptr = C::ToConstCharStar(s);      //const char * ptr = s.c_str();      char buffer[20];      strncpy(buffer, ptr, 20);      if (strcmp((const char *)buffer, SPECIALNAME)) {        finishFlag = TRUE;        cerr << "String compare failed at " << count << " in " << label << " thread" << endl;        return;      }      if (count % 10000 == 0)        cout << "tested " << count << " in " << label << " thread" << endl;    }    class TestThread : public PThread    {      PCLASSINFO(TestThread, PThread);      public:        TestThread(StringHolder & _holder)         : PThread(1000,NoAutoDeleteThread), holder(_holder)        { Resume(); }        void Main()         { int count = 0; while (!finishFlag && count < COUNT_MAX) holder.TestString(count++, "sub"); }	StringHolder & holder;    };    PThread * StartThread()    {      return new TestThread(*this);    }};struct PStringConv : public StringConv<PString> {  static const char * ToConstCharStar(const PString & s) { return (const char *)s; }};struct StdStringConv : public StringConv<std::string> {  static const char * ToConstCharStar(const std::string & s) { return s.c_str(); }};void Test1(){  /////////////////////  //  // test #1 - string concurrency test  //  // uncomment this to test std::string  //StringHolder<std::string, StdStringConv> holder(SPECIALNAME);    // uncomment this to test PString  StringHolder<PString, PStringConv> holder(SPECIALNAME);  PThread * thread = holder.StartThread();  finishFlag = FALSE;  int count = 0;  while (!finishFlag && count < COUNT_MAX)     holder.TestString(count++, "main");  finishFlag = TRUE;  thread->WaitForTermination(9000);  cerr << "finish" << endl;}//////////////////////////////////////////////////// test #2 - SIP URL test//#include <ptclib/url.h>void Test2(){  const char * urls[] = {    "sip:12345678@voxgratia.org",    "sip:12345678:5060@voxgratia.org",    "sip:12345678:1234@voxgratia.org",    NULL  };  const char ** url = urls;  while (*url != NULL) {    PURL sipURL(*url);    cout << "SIP URL : original = " << *url << ", URL = " << sipURL << endl;    ++url;  }}//////////////////////////////////////////////////// test #3 - PBYTEArray test//void Test3(){  {    PBYTEArray buffer1(1024);    PBYTEArray buffer2(buffer1);    cout << "base address of PBYTEArray 1 = " << (void *)(buffer1.GetPointer()) << endl;    cout << "base address of PBYTEArray 2 = " << (void *)(buffer1.GetPointer()) << endl;  }  {    PString str1("hello");    PString str2(str1);    str2 = "world";    cout << "base address of PString 1 = " << (void *)(str1.GetPointer()) << endl;    cout << "base address of PString 2 = " << (void *)(str2.GetPointer()) << endl;  }}//////////////////////////////////////////////////// test #4 - PString test//void Test4(){  {    PString pstring1("hello world");    PString pstring2(pstring1);    strcpy((char *)(const char *)pstring2, "overwrite");    cout << pstring1 << endl;    cout << pstring2 << endl;  }  {    PString pstring1("hello world");    PString pstring2(pstring1);    strcpy(pstring2.GetPointer(), "overwrite");    cout << pstring1 << endl;    cout << pstring2 << endl;  }}//////////////////////////////////////////////////// test #5 - queue channel test//#include <ptclib/qchannel.h>class Test5Thread : public PThread{  public:    Test5Thread(PQueueChannel & _qchan)      : PThread(100, NoAutoDeleteThread), qchan(_qchan)    {      Resume();    }    void Main()    {      PThread::Sleep(2000);      cout << "qchannel started" << endl;      PINDEX i = 0;      for (;;) {        char buffer[29];        if (!qchan.Read(buffer, sizeof(buffer)))          break;        cout << "qchan: buffer read" << endl;        PThread::Sleep(100);      }      cout << "qchannel ended" << endl;    }  protected:    PQueueChannel & qchan;};void Test5(){  PTimer timer(5000);  for (;;) {    cout << "timer = " << timer.GetMilliSeconds() << endl;    PThread::Sleep(200);  }  PQueueChannel qChannel(100);  PThread * thrd = new Test5Thread(qChannel);  char buffer[37];  memset(buffer, 'a', sizeof(buffer));  for (int i = 0; i < 3; ++i) {    cout << "writing buffer " << i << endl;    if (!qChannel.Write(buffer, sizeof(buffer))) {      cout << "write failed" << endl;    }  }  cout << "all buffers written" << endl;  thrd->WaitForTermination();  cout << "main done" << endl;}//////////////////////////////////////////////////// main//class StringTest : public PProcess{  PCLASSINFO(StringTest, PProcess)  public:    void Main();};PCREATE_PROCESS(StringTest);void StringTest::Main(){  PArgList & args = GetArguments();  if (args.GetCount() < 1) {    cout << "usage: strtest num [args...]\n"         << "\n"         << "where num is one of the following tests\n"         << "\n"         << "    1     string concurrency test\n"         << "    2     SIP URL test\n"         << "    3     PBYTEArray test\n"         << "    4     string test\n"         << "    5     queuechannel test\n"         << endl;    return;  }  switch (args[0].AsInteger()) {    case 1:   Test1(); return;    case 2:   Test2(); return;    case 3:   Test3(); return;    case 4:   Test4(); return;    case 5:   Test5(); return;    default:  break;  }  cout << "error: unknown test number " << args[0] << endl;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -