2006/12/27

Winsock の recv での WSAEWOULDBLOCK の対処  プログラミング

うーん、Winsock 使ってて、ソケットが非ブロックモードでもないのに recv が -1 を返し、WSAEWOULDBLOCK のエラーがセットされてる時がある。
なんでやねん…。

よく調べてないので分からないけど、select を呼んで対処した。誰か他にいい方法教えてください。(相変わらず <pre> タグが使えないので見づらい)

/* Winsock's recv to handle WSAEWOULDBLOCK error */
int
MyRecv(SOCKET fd, char *msg, int size, int flags)
{
int ret;
int _errno = 0;

WSASetLastError(0);

/* Try to receive */
if ((ret = recv(fd, msg, size, flags)) < 0)
_errno = WSAGetLastError();

/* If error is WSAEWOULDBLOCK, then wait until socket gets ready */
if (_errno == WSAEWOULDBLOCK) {
fd_set rset;

/* Initialize */
FD_ZERO(&rset);

/* Set server fd */
FD_SET(fd, &rset);

/* We have to select...... */
if (select(0, &rset, NULL, NULL, NULL) < 0)
return -1;

if (!FD_ISSET(fd, &rset)) {
fprintf(stderr, "Error: MyRecv: select: fd not set. Impossible!!");
return -1;
}

/* Receive */
if ((ret = recv(fd, msg, size, flags)) < 0)
return -1;

WSASetLastError(0);
}
else if (_errno)
WSASetLastError(_errno);

return ret;
}

0

2006/12/19

GtkTreeView で簡単に並び替えができるリストを作ろう  GTK

あまりにも情報量が少ない GtkTreeView。ここでは並び替えができる GtkTreeView のサンプルを書いておきます。

GtkTreeView をいじる人なら一度は見てると思う GTK+ 2.0 Tree View Tutorial ですが、どうも少々情報が古いようで、これよりも簡単にできるようです。

なんか AOL のブログって tab (indent) がうまく表示できないようなので、見づらいとは思いますが、UNIX の場合は indent コマンド等で整形して下さい。すいません。

でき上がりはこんな感じ↓

クリックすると元のサイズで表示します

ファイル名を tree_view.c とした場合のコンパイル方:
gcc -o tree_view tree_view.c -O -Wall `pkg-config --libs gtk+-2.0` `pkg-config --cflags gtk+-2.0`


#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>

/* Column definition -- # of columns used here is 2 (= COL_NUM) */
enum { COL_DATE, COL_NAME, COL_NUM };

/* Callback on "destroy" */
static void
DestroyCB (GtkWidget *widget, gpointer data)
{
gtk_main_quit();
}

/* main */
int
main(int argc, char **argv)
{
GtkWidget *window;
GtkTreeView *tree_view;
GtkListStore *store;
GtkTreeSortable *sortable;
GtkCellRenderer *rend;
GtkTreeViewColumn *column;
GtkTreeIter iter;

gtk_init(&argc, &argv);

/* Create the main, top level, window */
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

/* Give it the title */
gtk_window_set_title(GTK_WINDOW(window), "GtkTreeView Test");

/* Open it a bit wider so that both the label and title show up */
//gtk_window_set_default_size(GTK_WINDOW(window), 200, 50);

/*
* Connect the destroy event of the window with our on_destroy
* function When the window is about to be destroyed we get a
* notificaiton and stop the main GTK loop
*/
g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(DestroyCB), NULL);

/* Create a tree view */
tree_view = GTK_TREE_VIEW(gtk_tree_view_new());
gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(tree_view));

/* Create a list store for tree_view */
store = gtk_list_store_new(COL_NUM, G_TYPE_STRING, G_TYPE_STRING);
gtk_tree_view_set_model(tree_view, GTK_TREE_MODEL(store));
g_object_unref(store);
store = GTK_LIST_STORE(gtk_tree_view_get_model(tree_view));

/* Column - date */
column = gtk_tree_view_column_new();
rend = gtk_cell_renderer_text_new();
g_object_set(rend, "ypad", 0, NULL);
gtk_tree_view_column_set_title(column, "Date");
gtk_tree_view_column_pack_start(column, rend, FALSE);
gtk_tree_view_column_set_sort_column_id(column, COL_DATE);
gtk_tree_view_column_set_resizable(column, TRUE);
gtk_tree_view_column_set_attributes(column, rend, "text", COL_DATE,
NULL);
gtk_tree_view_append_column(tree_view, column);

/* Column - name */
column = gtk_tree_view_column_new();
rend = gtk_cell_renderer_text_new();
g_object_set(rend, "ypad", 0, NULL);
gtk_tree_view_column_set_title(column, "Name");
gtk_tree_view_column_pack_start(column, rend, FALSE);
gtk_tree_view_column_set_sort_column_id(column, COL_NAME);
gtk_tree_view_column_set_resizable(column, TRUE);
gtk_tree_view_column_set_attributes(column, rend, "text", COL_NAME,
NULL);
gtk_tree_view_append_column(tree_view, column);

/* Get sortable */
sortable = GTK_TREE_SORTABLE(store);

/* First, sort by date */
gtk_tree_sortable_set_sort_column_id(sortable, COL_DATE,
GTK_SORT_ASCENDING);

/* Add some data to tree_view */
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter,
COL_DATE, "1980/10/20",
COL_NAME, "Taro",
-1);

gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter,
COL_DATE, "1982/01/15",
COL_NAME, "Hanako",
-1);

gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter,
COL_DATE, "1984/04/29",
COL_NAME, "Jiro",
-1);

/* Make sure that everything, window and label, are visible */
gtk_widget_show_all(window);

/* Start the main loop */
gtk_main();

return 0;
}
0

2006/12/16

ハンカチ  

うちの母に「大叔母さんにハンカチでも買ってやれ」と言われて、探しに行った。
会社が街中でダウンタウンにあるんやけど、

ハンカチどこにも売ってへんやんけ!!

デパート、店じまいをする大きな服、雑貨屋さん、その他もろもろに行ったけど、どこにも売ってへんやんけ!! どななってんねん。
アメリカ人はハンカチ使わないんすか?

クリックすると元のサイズで表示します
0

2006/12/2

デジカメとビデオカメラ  

うちのデジカメは下の子が生まれた1999年に買ったもの。もう7年も経ってしまった。
電池は充電しても5分ぐらいでなくなるし、画像処理も遅い。
電池は交換した方がいいと思って、今週注文した。

ビデオカメラはもう壊れていて使えないけど、上の子が生まれた年1997年に買った Sony の Hi8 のもので、9年になってしまった。

どちらも使える限りは使いたかったけど、さすがにデジカメの方も電池の持たなさ、最大解像度で8枚しか取れないメモリーカード(本体自体が大きな容量のものに対応していない模様)とかで、新しい物に買い換えないといけないかなと思い始めてきた。

そこで色々調べてみたけど、最近のデジカメは安くて画像も綺麗なのに驚いてしまった…。すごいね、技術の進化って。
デジカメを調べているうちに、動画がどれだけ撮れるか気になってきた。いくら綺麗に撮れてもデータが圧縮されないで保存されれば意味ないし、と言う訳でちゃんと動画圧縮される物を調べてみた。

基本的にはサンヨーと Sony が力を入れてそうってわかったけど(他のメーカもたまに出してるみたいだけど)、Sony だけは Sony タイマーを心配してとりあえず退けた。
そこでサンヨーを調べてみた。何か電機メーカーだし、なんか会社の経営がちょっと?てな感じやったけど、結構悪くなさそう。
静止画の画質も、素人な自分には OK。動画の方は DMX-C6 系はいまいちだけど、DMX-HD1 系は HD でなかなか良さそう。素人なのでそんなに気にしないけど。
アメリカで売ってる VPC-HD1A は eBay で見る限り $500 後半て感じ。

さてどうするかな…。
0



teacup.ブログ “AutoPage”
AutoPage最新お知らせ