前段时间使用Android对线程的C++封装时出了一点小问题,简单总结一下。
希望能帮助大家避免和我犯一样的错误~~
Android对Thread的C++封装,见源码/frameworks/base/include/utils/threads.h
如何封装,点击链接 http://blog.csdn.net/yili_xie/article/details/4803517
因为是原创的吗,所以,不能盗取别人的成果,大家看完再回来看这里,看这里。。。。
重温一下重点:
virtual bool threadLoop() = 0;
这个函数是每个线程类都要实现的,在这里定义thread的执行内容,这个函数如果返回true,则函数会不停地执行threadloop中的内容,如果这个函数返回false,则threadloop中的内容仅仅执行一次线程就会退出。
我的问题出在哪里了呢???
问题出在 threadLoop() 里。。。按上面讲的“如果这个 threadLoop()返回false,则 threadLoop()中的内容仅仅执行一次线程就会退出;如果返回true,则函数会不停地执行threadLoop()中的内容”,我的问题是,当我返回true的时候,threadLoop()中的内容也华丽丽地仅仅执行一次,然后退出了
被骗了吗?不可能呀!!!
难道,难道,我人品爆发了
其实是我程序写错了。
上程序
ThreadTest.cpp
[cpp] view plaincopy
#define LOG_TAG "MyThread"
#include <utils/Log.h>
#include <utils/threads.h>
using namespace android;
class MyThread: public Thread {
public:
MyThread() {
LOGD("MyThread");
};
virtual ~MyThread(){
LOGD("~MyThread");
};
//如果返回true,循环调用此函数,返回false下一次不会再调用此函数
bool threadLoop(){
LOGD("threadLoop");
return true;
};
};
int main(){
LOGD("main start");
<strong><span style="color:#ff0000;"> sp<MyThread> th = new MyThread(); //正确的使用方法;
//MyThread* th = new MyThread(); //错误的使用方法;</span></strong>
th->run();
while(1);
LOGD("main end");
return 0;
}
Android.mk
[cpp] view plaincopy
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := ThreadTest.cpp
LOCAL_SHARED_LIBRARIES :=libcutils \
libutils
LOCAL_MODULE := libmonitor
LOCAL_MODULE_TAGS := eng
LOCAL_PRELINK_MODULE := false
include $(BUILD_EXECUTABLE)
这里的sp是什么捏
在android源码中我们可以看到很多sp<typename>的写法,这里的sp是android用来实现垃圾回收机制的智能指针。
详情请参考http://blog.163.com/bluesky_07_06_1/blog/static/1644400832010513944748/
总结:在上面我们用来测试的Demo程序中有两个注意点,
1.主线程要活着,所以这里用了while(1);
2.不要忘记sp, 定义线程sp<threadname> thread;
把我怎么错的写了一遍,大家引以为戒~~~
希望能帮助大家避免和我犯一样的错误~~
Android对Thread的C++封装,见源码/frameworks/base/include/utils/threads.h
如何封装,点击链接 http://blog.csdn.net/yili_xie/article/details/4803517
因为是原创的吗,所以,不能盗取别人的成果,大家看完再回来看这里,看这里。。。。
重温一下重点:
virtual bool threadLoop() = 0;
这个函数是每个线程类都要实现的,在这里定义thread的执行内容,这个函数如果返回true,则函数会不停地执行threadloop中的内容,如果这个函数返回false,则threadloop中的内容仅仅执行一次线程就会退出。
我的问题出在哪里了呢???
问题出在 threadLoop() 里。。。按上面讲的“如果这个 threadLoop()返回false,则 threadLoop()中的内容仅仅执行一次线程就会退出;如果返回true,则函数会不停地执行threadLoop()中的内容”,我的问题是,当我返回true的时候,threadLoop()中的内容也华丽丽地仅仅执行一次,然后退出了
被骗了吗?不可能呀!!!
难道,难道,我人品爆发了
其实是我程序写错了。
上程序
ThreadTest.cpp
[cpp] view plaincopy
#define LOG_TAG "MyThread"
#include <utils/Log.h>
#include <utils/threads.h>
using namespace android;
class MyThread: public Thread {
public:
MyThread() {
LOGD("MyThread");
};
virtual ~MyThread(){
LOGD("~MyThread");
};
//如果返回true,循环调用此函数,返回false下一次不会再调用此函数
bool threadLoop(){
LOGD("threadLoop");
return true;
};
};
int main(){
LOGD("main start");
<strong><span style="color:#ff0000;"> sp<MyThread> th = new MyThread(); //正确的使用方法;
//MyThread* th = new MyThread(); //错误的使用方法;</span></strong>
th->run();
while(1);
LOGD("main end");
return 0;
}
Android.mk
[cpp] view plaincopy
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := ThreadTest.cpp
LOCAL_SHARED_LIBRARIES :=libcutils \
libutils
LOCAL_MODULE := libmonitor
LOCAL_MODULE_TAGS := eng
LOCAL_PRELINK_MODULE := false
include $(BUILD_EXECUTABLE)
这里的sp是什么捏
在android源码中我们可以看到很多sp<typename>的写法,这里的sp是android用来实现垃圾回收机制的智能指针。
详情请参考http://blog.163.com/bluesky_07_06_1/blog/static/1644400832010513944748/
总结:在上面我们用来测试的Demo程序中有两个注意点,
1.主线程要活着,所以这里用了while(1);
2.不要忘记sp, 定义线程sp<threadname> thread;
把我怎么错的写了一遍,大家引以为戒~~~