作者 主題: fork()問題  (閱讀 5077 次)

0 會員 與 1 訪客 正在閱讀本文。

smallgreen29

  • 懷疑的國中生
  • **
  • 文章數: 87
    • 檢視個人資料
fork()問題
« 於: 2009-09-03 11:22 »
大大您們好,我在程式中加入fork(),讓程式作寫入檔案並用另一視窗顯示"writing.....",且writing後面的"."會慢慢增加,請問大大
pid_d pid;
switch(pid)
{
     case 0:
         newwin();
         break;
      default:
         save_file();
          break;
}
void newwin()
{
      int i = 0;
     WINDOW *pop_wind;
      pop_wind=newwin(5,32,10,10);
      mvwprintw(pop_wind,1,5,"%s","wrting.");
      while
      {
           mvwprintw(pop_wind,1,5+i,"%s",".");
            wrefresh(pop_wind);
           i++;
       }
}
由於此視窗(假設稱為B視窗)是跳出的,一開始會在b視窗顯示writing可是接下來會跑到原本視窗顯示".",可以請問大大原因嗎,我也有使用touchwin(),可是仍然無用,謝謝。
還是說有可以將他們寫一起的方法,一開始寫一起時,writing會無法慢慢增加"."顯示,所以才用fork()方式,謝謝
« 上次編輯: 2009-09-03 11:45 由 smallgreen29 »

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
回覆: fork()問題
« 回覆 #1 於: 2009-09-04 18:43 »
大大您們好,我在程式中加入fork(),讓程式作寫入檔案並用另一視窗顯示"writing.....",且writing後面的"."會慢慢增加,請問大大
pid_d pid;
switch(pid)
{
     case 0:
         my_newwin();
         break;
      default:
         save_file();
          break;
}
void my_newwin()
{
      int i = 0;
     WINDOW *pop_wind;
      pop_wind=newwin(5,32,10,10);
      mvwprintw(pop_wind,1,5,"%s","wrting.");
      while
      {
           mvwprintw(pop_wind,1,5+i,"%s",".");
            wrefresh(pop_wind);
           i++;
       }
}
由於此視窗(假設稱為B視窗)是跳出的,一開始會在b視窗顯示writing可是接下來會跑到原本視窗顯示".",可以請問大大原因嗎,我也有使用touchwin(),可是仍然無用,謝謝。
還是說有可以將他們寫一起的方法,一開始寫一起時,writing會無法慢慢增加"."顯示,所以才用fork()方式,謝謝


一個視窗您可以把他想像是一塊放在記憶體某區段的資料
而兩個視窗就是兩個不同區段的記憶體資料

透過呼叫refresh()系列函數可以指定刷新其中某個區塊的某範圍使之顯示到螢幕上
而newwin()則是賦予該視窗一個名稱以及範圍(大小)
其視窗大小可以超出螢幕的範圍(因為是一個記憶體區塊嘛,所以愛多大就多大啦)
當超出螢幕範圍時不是在一個固定範圍,如A4影印紙裏面畫東西
而是該張A4影印紙是您的螢幕
我們則在該A4影印紙割一個四方形的洞,透過這一個洞來看(顯示)後面的視窗(資料)

而在固定範圍內(螢幕)畫視窗也是一種方法,不過這種方法......A..綁手綁腳,您應該不會喜歡!!!


這樣講會不會有點神乎神乎的阿^^!
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

smallgreen29

  • 懷疑的國中生
  • **
  • 文章數: 87
    • 檢視個人資料
回覆: fork()問題
« 回覆 #2 於: 2009-09-07 09:15 »
大大您們好,我在程式中加入fork(),讓程式作寫入檔案並用另一視窗顯示"writing.....",且writing後面的"."會慢慢增加,請問大大
pid_d pid;
switch(pid)
{
     case 0:
         my_newwin();
         break;
      default:
         save_file();
          break;
}
void my_newwin()
{
      int i = 0;
     WINDOW *pop_wind;
      pop_wind=newwin(5,32,10,10);
      mvwprintw(pop_wind,1,5,"%s","wrting.");
      while
      {
           mvwprintw(pop_wind,1,5+i,"%s",".");
            wrefresh(pop_wind);
           i++;
       }
}
由於此視窗(假設稱為B視窗)是跳出的,一開始會在b視窗顯示writing可是接下來會跑到原本視窗顯示".",可以請問大大原因嗎,我也有使用touchwin(),可是仍然無用,謝謝。
還是說有可以將他們寫一起的方法,一開始寫一起時,writing會無法慢慢增加"."顯示,所以才用fork()方式,謝謝


一個視窗您可以把他想像是一塊放在記憶體某區段的資料
而兩個視窗就是兩個不同區段的記憶體資料

透過呼叫refresh()系列函數可以指定刷新其中某個區塊的某範圍使之顯示到螢幕上
而newwin()則是賦予該視窗一個名稱以及範圍(大小)
其視窗大小可以超出螢幕的範圍(因為是一個記憶體區塊嘛,所以愛多大就多大啦)
當超出螢幕範圍時不是在一個固定範圍,如A4影印紙裏面畫東西
而是該張A4影印紙是您的螢幕
我們則在該A4影印紙割一個四方形的洞,透過這一個洞來看(顯示)後面的視窗(資料)

而在固定範圍內(螢幕)畫視窗也是一種方法,不過這種方法......A..綁手綁腳,您應該不會喜歡!!!


這樣講會不會有點神乎神乎的阿^^!


大大您好,還是有點不太了解,那這樣的話為什麼一開始會正常顯示再我另一個視窗,謝謝

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
回覆: fork()問題
« 回覆 #3 於: 2009-09-07 19:23 »
void my_newwin()
{
      int i = 0;
     WINDOW *pop_wind;
      pop_wind=newwin(5,32,10,10);/*宣告一個WINDOW結構的視窗位置在5,32大小是10*10並指名為pop_wind*/
      mvwprintw(pop_wind,1,5,"%s","wrting.");/*將資料"wrting"字串填入pop_wind內並指定其位置是在pop_wind視窗的1,5*/

/*
print()系列函數只是將資料寫入記憶體,所以如果要馬上看到該資料需以refresh()系列函數予以刷新
在這裡mvwprintw(pop_wind,1,5,"%s","wrting.");已將資料寫入記憶體內等待遇到第一個Wrefresh(pop_wind)系列函數就顯示出來
*/

      while
      {
           mvwprintw(pop_wind,1,5+i,"%s",".");/*將資料"."字串填入pop_wind內並指定其位置是在視窗的1,5+i*/
            wrefresh(pop_wind);/*將pop_wind內的資料搬到螢幕上去(顯示出來)*/
/*
不管前面填入多少資料到視窗所佔用的記憶體內,當遇到refresh()系列函數時就會予以刷新(顯示出來)
所以將refresh()系列函數放在迴路裏面是很沒有效率的顯示方法
當然如有特殊需求(例如要讓他動起來的效果)則除外
*/
           i++;
       }
/*
使用完newwin(pop_wind)後用delwin(pop_wind)將佔用的記憶體空間還回去,有借有還再借不難嘛
*/

}

pop_wind是B視窗~~~那麼~~~原本視窗在哪裡?
« 上次編輯: 2009-09-07 19:28 由 stlee »
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

smallgreen29

  • 懷疑的國中生
  • **
  • 文章數: 87
    • 檢視個人資料
回覆: fork()問題
« 回覆 #4 於: 2009-09-21 18:13 »
void my_newwin()
{
      int i = 0;
     WINDOW *pop_wind;
      pop_wind=newwin(5,32,10,10);/*宣告一個WINDOW結構的視窗位置在5,32大小是10*10並指名為pop_wind*/
      mvwprintw(pop_wind,1,5,"%s","wrting.");/*將資料"wrting"字串填入pop_wind內並指定其位置是在pop_wind視窗的1,5*/

/*
print()系列函數只是將資料寫入記憶體,所以如果要馬上看到該資料需以refresh()系列函數予以刷新
在這裡mvwprintw(pop_wind,1,5,"%s","wrting.");已將資料寫入記憶體內等待遇到第一個Wrefresh(pop_wind)系列函數就顯示出來
*/

      while
      {
           mvwprintw(pop_wind,1,5+i,"%s",".");/*將資料"."字串填入pop_wind內並指定其位置是在視窗的1,5+i*/
            wrefresh(pop_wind);/*將pop_wind內的資料搬到螢幕上去(顯示出來)*/
/*
不管前面填入多少資料到視窗所佔用的記憶體內,當遇到refresh()系列函數時就會予以刷新(顯示出來)
所以將refresh()系列函數放在迴路裏面是很沒有效率的顯示方法
當然如有特殊需求(例如要讓他動起來的效果)則除外
*/
           i++;
       }
/*
使用完newwin(pop_wind)後用delwin(pop_wind)將佔用的記憶體空間還回去,有借有還再借不難嘛
*/

}

pop_wind是B視窗~~~那麼~~~原本視窗在哪裡?

大大我應該懂您的意思,可是竟然你這樣寫了
"
mvwprintw(pop_wind,1,5,"%s","wrting.");/*將資料"wrting"字串填入pop_wind內並指定其位置是在pop_wind視窗的1,5*/

/*
print()系列函數只是將資料寫入記憶體,所以如果要馬上看到該資料需以refresh()系列函數予以刷新
"而我也指定刷新我的pop_window視窗,那位何還是會先顯示在元視窗謝謝

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
回覆: fork()問題
« 回覆 #5 於: 2009-09-22 17:26 »
pop_wind是B視窗~~~那麼~~~原本視窗在哪裡?


您只newwin()了一個pop_wind視窗也就是說只向系統要了一塊記憶體
那麼原來視窗是哪一個呀?

stdscr標準視窗嗎?
可是您應該是要在stdscr標準視窗上開子視窗的吧(應該沒錯吧?)

還有....您這個問題的標題是fork()問題
翻了一下函數庫的書(怕不確定)fork()這個東東是"建立一個新的行程"
會不會您現在的問題就出在這裡呢?

其實開多個子視窗根本與fork()完全沒關係(唯一有可能的是那個行程只是佔據螢幕某區塊的"視窗")
所以在這個題目下問答newwin()相關的東西可能會更"灰"

在一個行程下開多個子視窗是可以的
只要把程式的流程掌握好套上遞迴也可以這樣搞(當然正常來說是不這樣弄的,因為我要做的是可以開無限個子視窗所以用到遞迴)
http://phorum.study-area.org/index.php/topic,48642.msg246480.html#msg246480
而所謂的遞迴不只是指A函數叫用A函數自己
也可以用A函數叫用B函數,B函數叫用A函數來形成另一種遞迴
或是A叫B,B叫C,C又叫用A函數.......
上面那個連結很像沒用到這個技巧,那應該是另一個"選單程式殼"才有用到,不過沒po出來過.....前幾年寫的現在有點灰了@@!

« 上次編輯: 2009-09-22 17:40 由 stlee »
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼