UI/worker thread

為了要解決進度顯示的問題,上 MSDN 找了一下,果然得到圓滿答覆.
請直接參考這幾篇吧…

簡單說明一下,主要是應用 .Net framework 本身就提供的架構,呼叫 Control 的 BeginInvoke() 去調用自己的 delegate 來幫你畫 UI, 以避免因為訊息繁忙而來不及更新畫面的問題.
如果要讓它可以被 cancel, 那麼,可以再配合 Event 來達到這個目的.
Cancel 的部份,我後來沒有用 Event 來做,這是我比較偷懶的地方.
對這方面如果還需要更詳細的了解,可以參考侯捷的Win32多緒程式設計.
不過這本書好像絕版了?!

dotLucene(2)

其實,依照 dotLucene 網站所提供的 Tutorial,就已經蠻足夠的了.不過我還是同時參考了源碼裡所附的 Demo.
這邊我就只寫出跟 Tutorial / Demo 不同的地方…
1.在 Document 部分,我參考了 Demo 的寫法, 另外寫了一個 FileDocument, 來產生 IndexWriter 所需要的 Document 類別.

public class FileDocument
{
public static Document Document( string title, string content)
{
// make a new, empty document
Document doc = new Document();
// Add necessary fields
// 這邊要 tokenized, 為了中文…
doc.Add( new Field(“title”, title, Field.Store.YES, Field.Index.TOKENIZED));
// Add the contents of the file to a field named “contents”.
// 原來是用 stream reader 來把整個檔案內容讀進來
// 這邊改成只把欄位資料放進去.
doc.Add( new Field(“contents”, content, Field.Store.YES, Field.Index.TOKENIZED));
// return the document
return doc;
}
private FileDocument()
{
}

2. 我把原來的 QueryParser 改成 MultiFieldQueryParser, 因為我想同時搜索主旨與內容.

string[] fields = { “title”, “contents” };
Query query = MultiFieldQueryParser.Parse( txtQueryString.Text, fields, analyzer );
Hits hits = searcher.Search(query);

大致上就這樣子…
我之後想搞一個進度顯示,讓使用者不會覺得太慢,不過怎麼樣都不行.
這應該就要應用所謂的 UI/worker thread 的技術了吧…
真的是對 Windows form.Net 太不熟了…
這再慢慢摸索吧…

dotLucene(1)

上星期逛網路的時候,不小心讓我給逛到 Lucene
*Lucene:基于Java的全文检索引擎简介
*DotLucene:37行代码实现全文搜索
*DotLucene: Full-Text Search for Your Intranet or Website using 37 Lines of Code
雖然以前就大略知道 Lucene, 但卻搞不太清楚他是幹麼的,逛完這幾篇之後,才知道是幹麼的.
於是就很想應用在紅狐論壇上.
上面的文章都是很不錯的入門文章,但是在我一開始投入的時候,的確讓我有很多困擾:
1.例子多半都是用 File / Directory 當作範例,真的可以用來搜索資料庫嗎?
2.又資料庫本身就有不錯的全文檢索,那麼,還需要這個嗎??
3.DotLuceneFbDirectory: DotLucene Index Storage for Firebird 這篇文章說可以拿 Firebird database 當作 storage, 那麼,我需要參考這篇文章這麼作嗎??
想了兩三天,也仔細看了兩三天…
1. 的確可以, dotLucene 有提供 Document 類別,而此類別可以讓你自由添加 Field 進去,所以我可以直接添加 Table 裡的某些欄位進去. 在 asp.net 上應用時,我可以參考這些我自定的欄位來產生網址,讓使用者可以直接點選網址進入.
2. 像 Microsoft SQL server 的確有提供全文檢索功能,可是據說很費效能. dotLucene 還不錯,搜索的時候速度蠻快的,也沒花什麼資源(用工作管理員觀察),不過這部分還需要詳細的實驗才知道.
3. 仔細看完這篇文章以後,才發現,雖然可以利用 database 當作 storage,可是並不建議,因為效能不高. 可惜的是文章內容並沒有提供效能評比,無法作進一步的比較.
在整個考量以後,決定先以紅狐所提供的論壇資料作為一個練習,也可以順便作一些實驗.

關於台中欣晃大火的新聞

今天早上看新聞的時候,看到記者與環保署的對話,不禁讓我捧腹大笑…
場景是在河邊,因為大火的關係,所以河水顏色變了,也有許多滅火器的泡沫.
記者:”請問這樣會不會對環境造成影響??” ( 錯誤的第一句話 )
環保署人員:”……..”
環保署人員:”你說呢??”
這真是讓我肚皮快笑破了,不過我老婆覺得沒啥好笑的….
這次台中大火,媒體說可能會很嚴重,不過依據一些報告指出,汙染已經擴散出去了.
詳情可以參考這個blog氣象達人 WeatherMan:
還好汙染已經擴散出去了
環保署協助台中市工業區大火
台中爆炸大火的空氣品質擴散情形

longjmp/setjmp

這是一組有趣的 api, 一般性的用法,是先使用 setjmp 設定 break point, 之後要跳回來的時候,就使用 longjmp.
所以,用法大概是這樣…

#include <stdio.h>
#include <setjmp.h>
jmp_buf setjmp_buffer;
int
main( int argc, char* argv[] )
{
if( setjmp( setjmp_buffer ) == 0 )
{
// do something
printf(“longjmp!!\n”);
longjmp( setjmp_buffer, 1 ); // 用 0 的話, setjmp() 就會收到 0, 那麼可能會無窮回圈
}
else
{
// do something
printf(“after longjmp.\n”);
}
}

很簡單吧,應該也可以兜出 try … catch … finally 的用法.
下面是我大致的想法

int exception_id;
if( ( exception_id = setjmp( setjmp_buffer ) ) == 0 ) // try
{
// do something
longjmp( setjmp_buffer, 1 ); // throw
}
else
{
if( exception_id == 1 ) // catch( 1 )
{
}
if( exception_id == 2 ) // catch( 2 )
{
}
// ….
}
// 之後,就是 finally…

之後再參考書看看吧… ^^

spam

在新浪部落格上發現的…
莫名其妙….指為了作論文,就來搞垃圾迴響??
不能認同,不能認同…砍!!

Dear blogger,
您好,我是中國文化大學新聞研究所研究生。我希望以研究台灣blog(台灣譯作部落格)的現況分析作為我的畢業論文,研究的目的在於了解blog書寫者的書寫動機、生活型態與書寫行為。
為了解台灣blog書寫者的真實的狀況,需要您的寶貴意見,盼望您能夠花10分鐘填寫這份問卷,協助我完成這項調查。
若您方便,也請幫忙將網頁問卷轉寄給有寫blog的人好嗎?
謝謝您!
我的研究主題是:”Weblog書寫動機、生活型態與書寫行為關聯性研究”
問卷網址:(略)
文化大學研究生敬上