566
社区成员
发帖
与我相关
我的任务
分享
// 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;
}