[VB.NET]WriteAllBytes中の割込み処理について

このQ&Aのポイント
  • ファイルをFile.WriteAllBytesでフロッピーディスクへ書き込んでいる最中にプログレスバー(またはgifアニメーション)を動作させたいのですが可能でしょうか?
  • タイマー処理とbyte配列のファイルへの書き込みを行う際に、固まったように見える割込み処理が発生しています。
  • 割込み時の処理にはMy.Application.DoEvents()を使用しています。
回答を見る
  • ベストアンサー

[VB.NET]WriteAllBytes中の割込み処理について

[VB.NET]WriteAllBytes中の割込み処理について いつも大変お世話になっています。 早速ですが、 ファイルをFile.WriteAllBytesで フロッピーディスクへ書き込んでいる最中に プログレスバー(またはgifアニメーション)を 動作させたいのですが可能でしょうか? もし可能であればアドバイスお願いいたします。 'タイマー処理 Timer1.Interval = 500 Timer1.Start() 'byte配列のファイルへの書き込み File.WriteAllBytes(name, dest) '<- 固まったように見える... Timer1.Stop() 割込み時の処理には My.Application.DoEvents() を使用しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • yorozu_ya
  • ベストアンサー率54% (76/140)
回答No.1

マルチスレッド をWeb検索しましょう。

tekesuta_1985
質問者

お礼

ご助言ありがとうございます。 これならできそうですね。試してみます。

関連するQ&A

  • Timer

    VB6.0で開発しています。 SQL問合せ中や、SHELLでDOSプロンプト実行中、 ファイルの圧縮中など、 処理時間が掛かるものにプログレスバーを表示しています。 Timerで時間毎に動いていればいいって感じなのですが、 SQL問合せ中など、動いてくれません。 画面をリフレッシュしても、DoEventsを入れてもダメです。 何か方法ありますか?

  • タイマーの使い方

    VB初心者です(6.0を使っています) タイマーの使い方がよく分かっていません。 ボタンを押してからの経過時間をラベルに表示させたいと思っているのですが、 ----------------------------------------------- Private Sub Command1_Click()   Timer1.Interval = 1000   処理1   処理2    ・    ・    ・   Timer1.Interval = 0 End Sub Private Sub Timer1_Timer()   Label1.Caption = [経過時間] End Sub ----------------------------------------------- という感じに書いていると、[処理1]~をしている間はラベルが表示されなくて、 最後の[処理]が終わった直後の[経過時間]のみが表示されます。 こういう形ではタイマーは使用できないのでしょうか? 他のWebサイトなども調べてみたのですが、解決できませんでした。 どなたか教えていただけませんでしょうか?

  • PictureBoxでのアニメーションのちらつき防止

    タイマーを使って,以下のような感じで PictureBox にCircleを動かす簡単なアニメーションを作成しているのですが,Timer.Interval=10で描画がかなりちらついてしまいます. この場合,ちらつきを無くすような方法はありませんでしょうか.よろしくお願いします. Private Sub Timer1_Timer() Picture1.Cls Picture1.Circle (x,y), 30, vbRed x = x + 1 y = y + 1 End Sub

  • VB2010で時間のかかる処理をする場合

    vb2010で開発しています。 時間のかかる処理をするのに、プログレスバーやアニメーションgifを使って 処理をしていることをユーザ側に知らせたいのですが、うまくいきません。 BackgroundWorkerという機能を使うというのはネットで調べたのでが、 それはLOOP等で繰り返し行う処理の場合はできそうなのですが、 今回はSQLSERVERに対して、DELETEやUPDATEを実行したいのです。 SQLを発行するのは一回なのですが、データ量が多いために時間がかかります。 それをうまく処理できる方法はありませんか?

  • Timer_Tickについて

    Timerイベントについてですが、Interval = 1 に設定し、例えば下記のようなプログラムを動かした場合、 /*-------------------------------------------*/ Private Sub Form_Load(~~)~~     Timer1.Start()     Original() '自作プロシージャ End Sub Private Sub Timer1_Tick(~~)~~     num += 1 'Publicで宣言してある     if num > 100 then Timer1.Stop() End Sub /*-------------------------------------------*/ Original()の処理に移るのは、numが100より大きくなってTimer1がStopしてからでしょうか? それとも、Timer1が動いている最中に、移ってるのでしょうか?

  • PICでタイマー割込み(mikroC Vr8.2)

    再三お世話になります。大概の問題もこちらで、 解決できて来ましたが、流石に今回はそうも行かないのではと 覚悟しております。 タイトルにありますPICと言えば、CCS社のコンパイラーが 王道と聞いておりますが、素人の浅はかで、 マイナーな方を選択した為、 お手上げ状態に陥っています。 質問の概要はサーボモータの制御信号生成が最終目的です。 まずその基本となる、前段部分として、一定巾周期のパルス毎に、 制御パルスを送り、希望通りの信号をLEDの点滅で確認出来るかと したものです。内容は(PIC16F887,8MHZ内部クロック使用、 1:8プリスケール、TIMER1とのコンペアマッチ割込みと、 TIMER0の割込みの2つのタイマー使用)TIMER1からは、 割り込み発生後、1秒毎にPORTB-1を点灯する信号を出し、 もう一方TIMER0から、0.5秒ごとにPORTB-1を消灯させる。 と言うものです。 後で気づきましたが、この時間設定では正確なものなら、 まず1秒後に点灯、次の1秒までの間に、もう一方で 0.5秒毎に消灯信号が出ているため、1秒後には お互い打ち消し合って本来ずっと消灯する 結果になるはずですが、実験では、0.1sec~0.5sec間隔の 点滅が、ある周期ごとに繰り返されます。 両方同時に割り込み処理が働き、命令サイクルのずれから、 点滅現象になるのではと推測します。 希望として、1秒の割込みの後に、 0.5秒の割込みが来るようにしたいのですが、 思うようになりません。 そこで、そのソースコードを記述しましたので 稀少mikroCをご使用の方に 検証とご教示が叶えられれば、最高に幸せです。 何卒宜しくお願いいたします。             記 unsigned count,count1 = 0; void interrupt() { //timer1 interrupt if(PIR1.CCP1IF == F) { PIR1.CCP1IF = 0; count++; if(count == 5) { PORTB.F1 = 1; count = 0; } } //timer0 interrupt if(INTCON.TMR0IF == 1) { INTCON.TMR0IF = 0; TMR0 = 216; count1++; if(count1 == 100) { PORTB.F1 = 0; count1 = 0; } } } void main() { ANSEL = 0; ANSELH = 0; TRISB = 0; PORTB = 0; PIE1.CCP1IE = 1; PIR1.CCP1IF = 0; CCP1CON = 0x0B; CCPR1L = 0x50; CCPR1H = 0xC3; T1CON = 0x31; OPTION_REG = 0x87; TMR0 = 216; INTCON = 0xA0; INTCON.PEIE = 1; INTCON.GIE = 1; while(1){} } 以上です。

  • VB6でImageを使ってアニメーションするときに画面がちらつく

    ImageコントロールであらかじめいくつかのGIF画像を読み込んでおいてTimerを使って一定時間ごとに表示用のImageコントロールに順番に転送してアニメーションをする。 このときGIF形式だと絵が変わるたびにちらつくけどBMP形式でやればちらつかない。 この原因はGIFから読み込むときに解凍していてその処理に時間がかかるからでOKでしょうか?

  • タイマーが動作しません

    H8/3052を使っていろいろ動作させようと考えてます、 タイマー割り込みのところで詰まっていますが、タイマー割り込みを使ってLEDを反転するというプログラムです。 結果、LEDが反転しないつまり、タイマー割り込みが動作してないのではないかと考えています。 うちが使いたいタイマーはウオッチドッグタイマです。イエローで、C言語を使っています。 皆様の知識をお借りしたいです。 //20msごとに割り込み、50回の割り込みでLED点灯反転 #include <3048.h> //3048、3052の内部I/O定義 #include <sysio.h> int c; //割り込み回数、外部変数とする //ITUインターバルタイマ割り込み void int_imia0(void) { ITU0.TSR.BIT.IMFA = 0; //割り込みステータスフラグクリア c-=1; if(c==0){ P5.DR.BYTE = ~P5.DR.BYTE; //LED出力データを反転 c=50; } } int main(void) { P5.DDR = 0xff; ITU0.TCR.BIT.CCLR = 1; //カウンタクリア要因 ITU0.TCR.BIT.TPSC = 3; //タイマプリスケーラ25MHz/8=3.125MHz ITU0.GRA =62499; //3.125MHz/62,500=50Hz、周期20ms ITU0.TIER.BIT.IMIEA = 1; //IMFAフラグによる割り込み許可 ITU.TSTR.BIT.STR0 = 1; //タイマスタート P5.DR.BYTE = 0xff; //LED出力データ初期値 c=50; //割り込み回数 _ei(); //割り込み許可 while (1); //何もしない } 動作できない為、ご指摘よろしくお願いします。

  • 処理の実行中にOutLookがまともに使用できない。

    お世話になります。 ファイルからデータを取り出し1行1行処理を行っており、 時間がかかりますので、1行毎にProgressBarをカウントアップしています。 そして、例えば処理中にメールソフトのOutLookでメールの返信でもしようとすると、ロックがかかっているのか、返信ボタンすら押せません。 処理が終わると通常通り使用できます。 どなたか、処理中でプログレスバーのゲージが進んでいる最中でも、OutLookが使用できる方法を教えて頂けないでしょうか。 <処理中のプログレスバーの呼ぶ方法(カウントアップ)> frmProgress.NextStep frmProgress.Show vbModeless, Me <プログレスバー内でのカウントアップ> Public Sub NextStep() On Error Resume Next ' 画面を更新する m_lCounter = m_lCounter + 1 ProgressBar.Value = m_lCounter lblCounter.Caption = CStr(m_lCounter) lblCounter.Refresh DoEvents '画面を更新する lblCounterMax = "/" + CStr(m_lngShoriCounterMax) + "件目処理中" ProgressBar.Max = m_lngShoriCounterMax On Error GoTo 0 End Sub <環境> VB(SP6)

  • H8/3048F IRQポートを使った外部割込みについて

    秋月電子のH8/3048Fマイコンボードを購入し、C言語による組み込みプログラムの演習を行っていて、マイコンボードのIRQ端子を使った外部割込みを実装しようとしてつまずいてしまいました。 メインループでLED点灯などの処理を行い、タクトスイッチの押下があったら別の処理を割り込ませ、またもとの処理に戻るという外部割込み処理を行いたいのですが、うまくいきません。 今おきている問題としては、 (1)電源の投入して、メインの処理(LED点灯)が行われる前になぜか一度IRQ割り込みが発生し、別処理が行われ、その後メインの処理を行う。 (2)IRQポートには立下り割り込み処理を行いたいので、プルダウン抵抗回路を組み、通常状態では、 IRQポート→チャタリング防止用のシュミットトリガ74LS19(NOT回路が含まれている)→10KΩの抵抗器→GND という回路でHIGH状態からタクトスイッチによる押下が行われたら、 0.1μFのコンデンサ→+5V という回路につながり、LOWになって、立下りエッジが検出され、割り込み処理が行われるはずだが、タクトスイッチを押下してもなかなか反応せず、5~6回押さないと割り込みが行われない。 (3)割り込み処理実行後、元の処理に戻らない。(このとき、タクトスイッチ押下による割り込み処理は再度受け付けてくれる) の3点です。 C言語関連のH8マイコンの教材は無く、Web上の情報でしか勉強していないので、必要な知識が欠けているかもしれませんが、どなたかお知恵を貸していただけないでしょうか? 当方のH8/3048Fによるプログラミング暦は1ヶ月ほどで、LEDの制御、外部スイッチ入力による処理等基本的なことは出来ていると思います。 メイン処理と割り込み処理のソースコードを載せておきます。 void int_irq0() //割り込み処理関数 { /* lcd_init(); lcd_locate(0,0); lcd_print("ワリコンダYO!"); wait(500); lcd_locate(0,0); lcd_print("モトニモドルYO!"); */ P5.DR.BIT.B0 = 1; wait(300); P5.DR.BIT.B0 = 0; wait(300); INTC.ISR.BIT.IRQ0F = 0; //ISRフラグをクリアする } void main(void){ //char moji[16] = "AKI-H8"; unsigned int rand_seed = 100; P1.DDR = 0x00; P5.DDR = 0xff; PB.DDR = 0xff; INTC.ISCR.BYTE = 0; INTC.ISCR.BIT.IRQ0SC = 1; //立下りエッジで割り込み検出 INTC.IER.BIT.IRQ0E = 1; EI; srand(rand_seed); timer_init(); /* タイマーの初期化 */ lcd_init(); /* 液晶表示器の初期化 */ lcd_locate(0,0); /* カーソル位置の指定 */ lcd_print("スイッチオセ!"); /* 文字列の表示 */ while(1){ //disp_data(); led_randset(); wait(100); led_allclr(); wait(10); } /* 無限ループ */ }

専門家に質問してみよう