- 1 名前:デフォルトの名無しさん mailto:sage [2011/04/30(土) 01:50:27.76 ]
- ここは Visual Basic 〜6.0 の質問スレです。
質問者は使用しているOS、VBのバージョン、サービスパックのバージョン、 「何がしたくて、どうしたけど、どう困っているのか」を明確に書きましょう。 VB.NETは別物なので専門スレで、VBA、APIの質問もそれぞれのスレで。 ○ 質問者の心得 一.質問する前にMSDNやGoogle、過去ログにも目を通してみる。 二.VBScript、インストーラーなどはこのスレでOK。 三.質問は第三者にもわかりやすいよう簡潔かつ具体的に。 四.荒らしは相手しない。 ○ 回答者の心得 一.答えられない質問は無駄に罵倒せずスルー。無理するな。 二.代用法を強制しない。 三.回答する上で必須ではない情報をむやみに聞き返さない。 四.荒らしは相手しない。 五.VB情報募集中。 六.回答は質問者が理解できるよう具体的に。 MSDN Online Japan ホーム www.microsoft.com/japan/msdn/default.asp Visual Studio 6.0 Service Pack 6 msdn.microsoft.com/vstudio/downloads/updates/sp/vs6/sp6/default.aspx Google www.google.co.jp/ ※「まず自分で調べる」クセを身につけよう。
- 935 名前:デフォルトの名無しさん [2012/01/13(金) 00:34:01.99 ]
- すみません、VB上でWin32APIのSleepを使って、現在のスレッドを
1000ms(1秒)一時停止させる処理を入れたいのですが、その際、 下記のようなソースの場合、DoEventsが実行されるタイミングは、 Sleep 1000でスレッドが停止して1秒たち、再度一時停止していた スレッドが再開した後でしょうか? それとも、Sleep 1000で1秒間分のスレッド一時停止が開始された 直後にDoEventsが実行されるのでしょうか? やりたいことは、Sleep 1000でストップしている間に、他のスレッド で発生してたまったWindowsメッセージを処理させたいと思っています。 ---以下ソースの一部--- Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Sub Command1_Click() Sleep 1000 DoEvents End Sub
- 936 名前:デフォルトの名無しさん mailto:sage [2012/01/13(金) 01:10:41.27 ]
- >>935
「それとも」って接続詞の使い方間違ってない? どっちも同じ意味にしか聞こえんけど....
- 937 名前:デフォルトの名無しさん mailto:sage [2012/01/13(金) 01:22:59.63 ]
- ああ、>>935の意味がやっと分かったw
要するに>>935はスレッドが何か全然分かってないんだね。 コード(当然DoEventsを含む)が実行されるということは、そのスレッドが 制御を持ってる(ブロックされてない)ということ。 〜が実行されるのは眠った後ですか?なんて質問は愚問過ぎ。 実行されない状態を作るのがSleepなんだよw
- 938 名前:935 [2012/01/13(金) 01:23:04.80 ]
- >>936
わかりにくくてすみません。。 Sleepで一時停止中か、一時停止しスレッドが開始した後か という意味です。
- 939 名前:デフォルトの名無しさん mailto:sage [2012/01/13(金) 01:25:11.09 ]
- 停止中はどのような命令も実行されないわけですが
- 940 名前:935 [2012/01/13(金) 01:25:28.49 ]
- >>937
ありがとうございます やはり、Sleepが実行されて、そのスレッドが止まると、 当然次の処理であるDoEventsも停止中は、実行されない と言うことですね。 であれば、DoEventsするスレッドを別に立てるしかないという ことでしょうか?
- 941 名前:デフォルトの名無しさん mailto:sage [2012/01/13(金) 01:32:12.87 ]
- >>940
いやまず最終的に何がしたいのか書かないと何とも言えんと思うけど.... 「(重い)処理」を別スレッドでやるのなら普通はDoEventsなんて必用ないですよ。 DoEventsは、UIスレッドで(ビジーループ的な)重い処理を実行しても UIが無反応になることを避けたい場合だけに使うんですよ。
- 942 名前:935 [2012/01/13(金) 01:50:55.91 ]
- >>941
説明不足ですみません。 >>935は一例としてあげたソースになります、実際には、、 UI(Form)に配置したTextBoxに時計表示を出して、それを1秒ごとに更新して 表示させたいのですが、同時に3秒ごとに別の処理の繰り返しをしたいと思っています。 その際、3秒待つのに単純にSleep 3000という行を追加すると、UIの時計更新が止まって しまうので、3秒待っている間でもForm上の時計表示は動かしたままにしておきたいと 思い質問しました。 ちなみに、UIスレッドとは、Formのソース内に書かれているプロシージャ群の 処理が実行されるスレッドということでしょうか?
- 943 名前:デフォルトの名無しさん mailto:sage [2012/01/13(金) 05:47:47.09 ]
- x秒ごとに処理したいのにスレッドを止める必要ないでしょ
だいたい処理が瞬間に終わるわけでもあるまいし。 インターバルを設定できるTimerってのがあるんだけど
- 944 名前:デフォルトの名無しさん mailto:sage [2012/01/13(金) 07:19:27.57 ]
- VB6でマルチスレッドってActiveXを使うやり方?
- 945 名前:デフォルトの名無しさん mailto:sage [2012/01/13(金) 08:53:01.02 ]
- できた
Private cnt As Integer Private Sub Form_Load() cnt = 0 Timer1.Interval = 1000 End Sub Private Sub Timer1_Timer() cnt = cnt + 1 Label1.Caption = cnt If cnt Mod 3 = 0 Then Shell "notepad" '重い処理 End If End Sub
- 946 名前:デフォルトの名無しさん mailto:sage [2012/01/13(金) 09:21:22.64 ]
- VBは1つのスレッドで、DoEventsによって並列処理を
しているように見せているだけ。 Sleepしたらそのスレッドは止まるのだから、VBプログラムの全てが止まる。 DoEventsでそういうことをやっているとデッドロックしやすい。 DoEventsをSwitchToThreadを同じようなものだと思っていると痛い目を見る。 非同期処理したいのであれば、Timerを使うべき。
- 947 名前:デフォルトの名無しさん mailto:sage [2012/01/13(金) 09:38:57.77 ]
- マルチスレッドがやりたいならvb.netを使ったほうがいいよ
vb6でやるならマルチプロセスでやったほうがいいな
- 948 名前:デフォルトの名無しさん mailto:sage [2012/01/13(金) 14:16:45.68 ]
- ActiveXExeのスレッドでマルチスレッドをやってみたことはある。
非同期で処理しようと思ったら、結局別スレッドで作成した FormにTimerをおいて、そこから処理をスタートさせなければならない。 メソッドやプロパティはオブジェクト側のスレッドで同期して実行されるので 別スレッドのオブジェクトを呼び出しまくると、全然並列処理にならないw
- 949 名前:デフォルトの名無しさん mailto:sage [2012/01/13(金) 18:56:07.60 ]
- >>934
あるよ。 FOR EACH的なものまである。 >>933 制御文レベルだとどれも似たようなもん。 しかし、それをもってほとんど一緒というお前はまだまだ素人。
- 950 名前:デフォルトの名無しさん mailto:sage [2012/01/13(金) 19:08:54.62 ]
- >>942
Sleep 3000 は、3秒間何も出来ません、の意味。 やるんなら Private Sub Timer1_Timer() 'インターバルを1000にしておく Static cnt As long If cnt = 0 Then 'ここに3秒ごとの処理を入れる End If Text1.Text = Format(DateTime.Now(),"yyyy/mm/dd hh:nn:ss") cnt = cnt + 1 If 3 <= cnt Then cnt = 0 End If End Sub >>945 それだとcntが32768でオーバーフローになる
- 951 名前:デフォルトの名無しさん mailto:sage [2012/01/14(土) 16:29:09.18 ]
- VisualBasicEditor(VB6 や OfficeVBA のエディタ部分)の
初期フォントの決定ルールを教えて欲しいです。分かる方、いますでしょうか。 日本語環境なら、MS ゴシック、英語環境ならCourier Newのようです。 オプションダイアログからフォント設定を変更した後ならレジストリに記録されてましたが、 インストール後からフォント変更するまでは、レジストリには項目がありませんでした。 知りたい理由は、VisualBasicEditor上に同じフォントで文字を描画したいからです。 同じフォントで描画ができればいいので、稼働中のVisualBasicEditorのフォント名などの情報や HFONT、LOGFONTなどを取得する方法がありましたら、そちらの方が適切に思うのですが、 VBEウィンドウに対してGetDC、GetWindowDCした後、GetTextFaceなどでは駄目でした。 初期フォントや稼働中フォントの取得方法が分かる方、どうぞよろしくお願いします。
- 952 名前:デフォルトの名無しさん mailto:sage [2012/01/14(土) 16:58:49.24 ]
- ここってやっぱりVB.NET扱ってませんよね(´・ω・`)?
- 953 名前:デフォルトの名無しさん mailto:sage [2012/01/14(土) 18:48:29.76 ]
- >>952
扱ってたら>>1に「VB〜6.0の」なんて書いてありませんよね。日本語理解できてますか(´・ω・`)?
- 954 名前:デフォルトの名無しさん mailto:sage [2012/01/14(土) 19:18:03.31 ]
- >>953
いるよねぇ。こういう一言多いやつ
- 955 名前:デフォルトの名無しさん mailto:sage [2012/01/14(土) 19:34:06.91 ]
- やっぱり扱ってませんでしたか
お騒がせしました(´・ω・`)
- 956 名前:デフォルトの名無しさん mailto:sage [2012/01/14(土) 20:21:19.59 ]
- >>955
もう見てないと思うが、.netはここ VB.NET質問スレ(Part38) toro.2ch.net/test/read.cgi/tech/1325083428/
- 957 名前:デフォルトの名無しさん [2012/01/27(金) 04:15:41.25 ]
- >>951
VBインストール直後はフォント情報がレジストリにないということは レジストリ読んでみて、登録されてなかったら、そのデフォルトフォントにすればいいのでは? レジストリ読むAPIはAPIビューアの定義は間違いだらけだから気をつけて あれってVB5の時から間違ったままだから、初心者に諦めさせるように故意に間違えてるんだろか
- 958 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 09:32:31.10 ]
- APIの引数はByVal As Longで宣言して
StrPtrとVarPtrで渡す時代
- 959 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 00:24:21.02 ]
- >>957
レス感謝です。もうレスは無いかと半ば諦めてました。 今のところ、まずはレジストリから取得するようにしています。 デフォルトフォントはOSの言語で決まるようだったので、できれば決め打ちではなく、 VB6と同じような何らかの決定ルールに従いたいと思ってました。 (英語版VB6を日本語版WinXPで試したところ、MS ゴシックがデフォルトフォントになりました) 詳細は読めなかったのですが、中国のサイトでソフトが紹介されているのを見つけたので、 少数ながら、海外にもユーザーがいるみたいなので、それもフォントを決め打ちにしたくない理由の1つです。 色々試してみて、どうやらレジストリから取得しているわけではなさそうなのですが…。
- 960 名前:デフォルトの名無しさん [2012/01/28(土) 08:35:49.31 ]
- そうねぇ、外国のOSならMSゴシックはないよねぇ
とするとWindowsのどこかに・・ フォント名が定義されてるレジストリは余りないようだけど HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont あたりはどうでしょ こんなのを別のフォント名に変えてVBを新規インストールしてみて その変えたフォントになるかどうか ま、人に配布するソフトはそんな推測で作っちゃいけないよね
- 961 名前:デフォルトの名無しさん mailto:sage [2012/01/30(月) 21:50:30.26 ]
- >>960
VB6新規インストールは行っていないものの、 レジストリ上の"MS ゴシック"、"MS Gothic"、"msgothic.ttc"を 別のものに変えて試してみたのですが空振りでした。 色々試してみたところ、VB6については、OSの言語に依存しているのではなく、 [コントロールパネル]-[地域と言語のオプション]-[詳細設定]-[Unicode 対応でないプログラムの言語] の設定に依存していることが分かりました。 また、この項目で「中国語(香港)、(マカオ)、(シンガポール)」を選択すると、 VBEで使用するフォントが必要な状況になるとVB6が強制終了してしまうことが分かりました。 内部でベタで持ってるのかもしれませんね…。 とりあえず、レジストリから取得、取得できない場合はベタ書きにしようと思います。
- 962 名前:デフォルトの名無しさん mailto:sage [2012/01/30(月) 23:31:01.21 ]
- 961に誤りがあったので、誰かが変に参考にしないように訂正を。
[Unicode 対応でないプログラムの言語]の設定を 「中国語(香港)、(マカオ)、(シンガポール)」にするとVB6が強制終了すると書きましたが それは英語版VB6の話で、日本語版VB6の場合は問題ありませんでした。
- 963 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 21:47:40.78 ]
- 会社で仕事関係の一切の情報持ち出し、持込禁止になってから止めてたんだけど、PCにVB6インストールしようかなあ。
久しぶりに触りたくなってきた。
|

|