- 论坛徽章:
- 0
|
本帖最后由 funcman 于 2010-04-27 00:32 编辑
- // Loader.h
- #ifndef LOADER_H
- #define LOADER_H
- extern "C" {
- typedef struct LoadRequest_ LoadRequest;
- LoadRequest*SendRequest(char* filename);
- void ReleaseRequest(LoadRequest* request);
- void* GetData(LoadRequest* request);
- bool IsReady(LoadRequest* request);
- bool IsError(LoadRequest* request);
- }//extern "C"
- #endif//LOADER_H
复制代码- // Loader.cpp
- #include "Loader.h"
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <assert.h>
- #include <pthread.h>
- extern "C" {
- typedef enum RequestState_ {
- LOADING,
- READY,
- ERROR,
- } RequestState;
- typedef struct Request_ {
- RequestState stat;
- char filename[512];
- void* data;
- } Request;
- void* load_func_(void* arg) {
- assert(arg);
- Request* req = (Request*)arg;
- FILE* fp = fopen(req->filename, "r");
- if( !fp ) req->stat = ERROR;
- else {
- fseek(fp, 0, SEEK_END);
- int len = ftell(fp);
- req->data = malloc(len);
- if( !(req->data) ) req->stat = ERROR;
- else {
- fseek(fp, 0, SEEK_SET);
- fread(req->data, len, 1, fp);
- req->stat = READY;
- }
- fclose(fp);
- }
- return 0;
- }
- LoadRequest* SendRequest(char* filename) {
- pthread_t t;
- Request* req = (Request*)malloc(sizeof(Request));
- if(!req) return 0;
- req->stat = LOADING;
- strcpy(req->filename, filename);
- pthread_create(&t, 0, load_func_, req);
- return (LoadRequest*)req;
- }
- void ReleaseRequest(LoadRequest* request) {
- assert(request);
- Request* req = (Request*)request;
- assert(req->stat==READY);
- free(req->data);
- free(req);
- }
- void* GetData(LoadRequest* request) {
- assert(request);
- Request* req = (Request*)request;
- if( req->stat != READY ) return 0;
- return req->data;
- }
- bool IsReady(LoadRequest* request) {
- assert(request);
- Request* req = (Request*)request;
- return (req->stat==READY);
- }
- bool IsError(LoadRequest* request) {
- assert(request);
- Request* req = (Request*)request;
- return (req->stat==ERROR);
- }
- }//extern "C"
复制代码- // Main.cpp
- #include <stdio.h>
- #include "Loader.h"
- int main(void) {
- LoadRequest* req = SendRequest("test.txt");
- while( !IsReady(req) ) {
- if( IsError(req) ) {
- printf("Error!\n");
- break;
- }
- printf("Loading...\n");
- }
- if( IsReady(req) ) {
- printf("Ready!\nThe text is:%s\n", (char*)GetData(req));
- }
- return 0;
- }
复制代码 编译自然是:
$ g++ Loader.cpp Main.cpp -o MLLoader
运行是正常的。
我就是想知道,我这么写是不是包含了很多潜在的错误。
谢家指正!
:) |
|