有些iPhone程序是直接从其他平台移植过来,或者说你喜欢使用cpp,再或者是你打算让你的程序跨越平台,那么使用跨平台的cpp库无疑是一个很好的选择。这就是本系列的主题。

第一篇为大家分享一段本人自用的线程类。它使用pthread,因此可以跨平台使用(windows下需要下载pthread库)。由于程序很简单,就不做什么说明了。

头文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#ifndef _UTILS_THREAD_H_
#define _UTILS_THREAD_H_

#include <pthread.h>

namespace utils
{

class CThread
{

public:
    typedef void( ThreadCallback( void * ) );

typedef enum
{
    THREAD_STOP = 0,
    THREAD_RUN,
    THREAD_PAUSE
} ThreadState;

CThread(ThreadCallback* callback, void* pUserData);

~CThread();

ThreadState state() const           { return m_state;       }

ThreadCallback* callback() const    { return m_pCallback;   }

void* userData() const              { return m_pUserdata;   }

pthread_t thread() const            { return m_thread;      }

void run();

void stop();

void pause();

private:

    ThreadCallback*     m_pCallback;
    pthread_t           m_thread;
    ThreadState         m_state;
    unsigned int        m_uiThreadId;
    void*               m_pUserdata;

};

}

#endif // _UTILS_THREAD_H_

cpp文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include "utils/Thread.h"

namespace utils
{

void* threadRun( void *_ptr )
{
    unsigned char run = 1;
    CThread* theThread = ( CThread* )_ptr;

    while( run )
    {

        switch( theThread->state() )
        {

        case CThread::THREAD_RUN:
        {
            CThread::ThreadCallback* callback = theThread->callback();

            if ( callback )
                callback( theThread->userData() );

            break;
        }

        case CThread::THREAD_STOP:
        {
            run = 0;
            break;
        }

       case CThread::THREAD_PAUSE:
       {
           msleep(50);
       }
    }
}

return NULL;

}

CThread::CThread(ThreadCallback* callback, void* pUserData)
: m_pCallback(callback),
  m_pUserdata(pUserData),
  m_state(THREAD_PAUSE)
{
    m_uiThreadId = pthread_create( &m_thread,NULL,threadRun, (void *)this );
}

CThread::~CThread()
{
    pthread_join( m_thread, NULL );
}

void CThread::run()
{
    m_state = THREAD_RUN;
}

void CThread::stop()
{
    m_state = THREAD_STOP;
}

void CThread::pause()
{
    m_state = THREAD_PAUSE;
}

}

msleep函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include &lt;sys/time.h&gt;

void msleep( unsigned int ms )
{

    int microsecs;
    struct timeval tv;
    microsecs = ms * 1000;
    tv.tv_sec  = microsecs / 1000000;
    tv.tv_usec = microsecs % 1000000;
    select( 0, NULL, NULL, NULL, &amp;tv );

}

使用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void* onRun(void* ptr)
{

......

}

utils::CThread* m_pThread = new utils::CThread((ThreadCallback*)onRun,NULL);

m_pThread-&gt;run();

......

delete m_pThread;

作者:bagusflyer