■スレッドを使ったプログラムのコンパイルについて
○スレッド
■ボタンを押すとスレッドを作成して、スレッドからボタンの文字を変更します
ボタンを複数回押すと複数のスレッドが作成されて、複数のスレッドからボタンの文字が変更されます
複数から描画&フラッシュされるとメモリリークしますので排他制御したほうが良いかもしれません
#include <stdio.h>
#include <sys/types.h>
#include <pthread.h>
#include <X11/StringDefs.h>
#include <X11/Intrinsic.h>
#include <X11/Xaw/Form.h>
#include <X11/Xaw/Command.h>
Widget button1;
//ボタンやラベルの文字を変更する
void setCaption(Widget w,char*str){
Arg args[1];
XtSetArg(args[0],XtNlabel,(XtArgVal)str);
XtSetValues(w,args,1);
XClearArea(XtDisplay(w), XtWindow(w), 0, 0, 0, 0, True);//再描画
XFlush(XtDisplay(w));//バッファをフラッシュ
}
//ボタンやラベルの文字を取得する
void getCaption(Widget w,char*str){
char*st;
Arg args[1];
XtSetArg(args[0],XtNlabel,(XtArgVal)&st);
XtGetValues(w,args,1);
strcpy(str,st);
}
//スレッドメソッド
void *thread(void *arg){
int i;
char s[128];
for(i=0;i<10;i++){
sleep(1);
sprintf(s,"%d",i);
setCaption(button1,s);
}
}
//ボタンが押された時の動作
void Button1Callback( Widget w, XtPointer client, XtPointer called )
{
//スレッドを作成
pthread_t thread1;
int i=pthread_create(&thread1,NULL,thread,(void *)"Thread1");
if(i) printf("err\n");
}
main( int argc, char **argv )
{
XtAppContext app_context;
Widget top;
top = XtVaAppInitialize( &app_context, "test", NULL, 0, &argc, argv, NULL,NULL);
Widget form = XtVaCreateManagedWidget("form",formWidgetClass,top,NULL);
//ボタンの作成
button1 = XtVaCreateManagedWidget("button1",//ウィジット名
commandWidgetClass,//ボタンクラスを指定
form,
//リソースの直接入力(どんどん追加できる)
XtNlabel,"button1",//表示される文字
XtNwidth,100,//幅と高さ
XtNheight,20,
XtNborderWidth,1,//境界線
//リソースここまで
NULL);
XtAddCallback(button1, XtNcallback,Button1Callback,(XtPointer)NULL);//ボタンのコールバック関数を登録
XtRealizeWidget( top );
XtAppMainLoop( app_context );
}
■排他制御を付けたプログラム
#include <stdio.h>
#include <sys/types.h>
#include <pthread.h>
#include <X11/StringDefs.h>
#include <X11/Intrinsic.h>
#include <X11/Xaw/Form.h>
#include <X11/Xaw/Command.h>
Widget button1;
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
//ボタンやラベルの文字を変更する
void setCaption(Widget w,char*str){
pthread_mutex_lock(&m);//ロックする
Arg args[1];
XtSetArg(args[0],XtNlabel,(XtArgVal)str);
XtSetValues(w,args,1);
XClearArea(XtDisplay(w), XtWindow(w), 0, 0, 0, 0, True);//再描画
XFlush(XtDisplay(w));//バッファをフラッシュ
pthread_mutex_unlock(&m);//ロックを解除する
}
//ボタンやラベルの文字を取得する
void getCaption(Widget w,char*str){
char*st;
Arg args[1];
XtSetArg(args[0],XtNlabel,(XtArgVal)&st);
XtGetValues(w,args,1);
strcpy(str,st);
}
//スレッドメソッド
void *thread(void *arg){
int i;
char s[128];
for(i=0;i<10;i++){
sleep(1);
sprintf(s,"%d",i);
setCaption(button1,s);
}
}
//ボタンが押された時の動作
void Button1Callback( Widget w, XtPointer client, XtPointer called )
{
//スレッドを作成
pthread_t thread1;
int i=pthread_create(&thread1,NULL,thread,(void *)"Thread1");
if(i) printf("err\n");
}
main( int argc, char **argv )
{
XtAppContext app_context;
Widget top;
top = XtVaAppInitialize( &app_context, "test", NULL, 0, &argc, argv, NULL,NULL);
Widget form = XtVaCreateManagedWidget("form",formWidgetClass,top,NULL);
//ボタンの作成
button1 = XtVaCreateManagedWidget("button1",//ウィジット名
commandWidgetClass,//ボタンクラスを指定
form,
//リソースの直接入力(どんどん追加できる)
XtNlabel,"button1",//表示される文字
XtNwidth,100,//幅と高さ
XtNheight,20,
XtNborderWidth,1,//境界線
//リソースここまで
NULL);
XtAddCallback(button1, XtNcallback,Button1Callback,(XtPointer)NULL);//ボタンのコールバック関数を登録
XtRealizeWidget( top );
XtAppMainLoop( app_context );
}
▲トップページ
>
Linux と C