くだすれDelphi(超初心者用)その57 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2016/10/13(木) 13:21:54.84ID:7i5E+q2+
Delphi(デルファイ)について、他のスレッドでは書き込めない超低レベル、もしくは
質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。

Delphi使いが優しくコメントを返しますが、
お礼はDelphiの布教と初心者の救済をお願いします。

■Delphi XE6 Professional/Enterprise/Ultimate/Architect エディション(トライアル版有)
64bit Windows、Mac OS XからiOS、Androidのアプリも開発可能。ライブラリのソースコード付き。アカデミックライセンス有り。
旧バージョン(XE6/5/4/3/2/XE/2010/2009/2007/Delphi 7)のライセンス取得とダウンロードが可能。(アカデミック不可)
ttp://www.embarcadero.com/jp/products/delphi

■Delphi XE6 Starter エディション
個人/5人以下の企業・組織向け。年間売上1000US$以内の商用開発可。
(※)Delphi、Visual Studio等の有償/無償の開発ツールユーザーが対象。インストール確認は特に行わない。
ttp://www.embarcadero.com/jp/products/delphi/starter

■Embarcadero RAD Studio XE6 (Delphi、C++Builder、HTML5 Builder等を含むビジュアル開発スイート)
ttp://www.embarcadero.com/jp/products/rad-studio

<前スレ>
くだすれDelphi(超初心者用)その56
http://echo.2ch.net/test/read.cgi/tech/1405783063/

<過去スレ>
DelWiki (Delphi 関連の過去スレッド)※行方不明
ttp://delwiki.info/?
2016/12/18(日) 18:39:46.50ID:SM4ZDbUW
 TreeView をデザイン時にフォームに貼り付けてできたアプリを終了するとき
 TreeView の各ノードが保持するデータ(TreeView1.Items[n].data が保持しているデータ)
も自動的に廃棄されるのですか?
2016/12/18(日) 18:51:06.13ID:U6l2OwGO
>>164
TTreeNode::Data が保持するデータはプログラマが明示的に破棄しないとダメ。
2016/12/18(日) 20:05:19.93ID:SM4ZDbUW
>>165
 ありがとう。
 以下のような感じでいいのですかな?

//TNodeData は TreeNode.Data が保持するデータのクラス

//+----------- FormDestroy ------------+
procedure TForm1.FormDestroy(Sender: TObject);
i: Integer;
begin
with TreeView1 do
for i = 0 to Items.Count - 1 do
TNodeData(Items[i].Data).Free;

//TreeView1.Items.Clear; 不要
end;

 あるいは TreeView のOnDeletion を使って

//+-------------- TreeViewDeletion --------------+
procedure Form1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin
if Assigned(Node.Data) then
TNodeData(Node.Data).Free;
end;
2016/12/18(日) 20:17:52.63ID:U6l2OwGO
>>166
そんな感じ。
2016/12/20(火) 23:16:00.88ID:ifPrFvUo
スレッドを使ったプログラムで、スレッド内にある未使用の変数をコメントアウトしたら、
終了する時にアクセスバイオレーションが出るんだけど、こんな事ってあるの?
プライベートに宣言してあるからメインとかが絡んでる事は無いのだけど。
2016/12/20(火) 23:35:38.32ID:qjg7YQIs
コメントアウトされた変数が確保していたメモリ域のおかげで
偶然アクセス違反が発生しない状態になってるとかじゃね?
要はコメントアウトしていなくてもコーディングミスで不正なメモリアクセスしている状態なのかも
2016/12/20(火) 23:43:04.81ID:ifPrFvUo
こんな時間にありがとう!
そんな事があり得るんですか。
難しいなぁ。
2016/12/21(水) 12:39:12.66ID:kCrlwcjM
あり得るというより一番多いパターンだったり
2016/12/21(水) 14:28:11.26ID:yxrWTbmA
「参照」とポインタの話か? 慣れるまで結構厄介だからな。
2016/12/21(水) 17:50:14.49ID:69vl5rId
ちょっと教えてください

自分自身(実行ファイル)を再起動する方法を教えてください
ちなみに二重起動を禁止したアプリでです
できれば再起動用の別アプリを使用しないのが理想的です...
2016/12/21(水) 18:38:54.87ID:3rWlzZt5
>>173
自分自身が起動するときだけ二重起動許可して起動確認できたら自分を閉じる
2016/12/21(水) 21:13:47.15ID:69vl5rId
>>174
ありがとうございます。
やはりその方向ですか。

リスタート後に最初のインスタンスのiniファイルを読み込みたいで
Mutexのチェックの前に最初のインスタンスの終了を待つ処理が
必要かなと漠然と考えていたんですが...

簡単でスマートな方法はないんですね
2016/12/21(水) 21:25:28.28ID:GvkBvmPc
>>175
自分(プロセスA)が自分(プロセスB)を起動するときに、コマンドラインで /restart というようなコマンドを渡す。
プロセスBは /restart ってコマンドを受け取ったら、Mutexの所有権を得るまで待機する。(再起動処理)
プロセスAはMutexの所有権を開放する。
/restartを受け取らなかった場合は、Mutexの所有権を得られなかった場合は終了する。(二重起動防止)
2016/12/21(水) 23:03:33.63ID:V2gs4HSo
>>176
そうですね

Mutexが取得できるまで待機すればいいですよね
終了待ちをもっと複雑な方法で考えてました
ありがとうございます
178デフォルトの名無しさん
垢版 |
2016/12/22(木) 20:53:24.89ID:GbxNFxpQ
よろしくお願いします。
『レコード型Aを利用する、クラスA』を自作したとします。
そして、『このクラスAとほとんど同じ機能を持つが、レコード型Bを利用する、別のクラス』を作りたいとします。
この場合、どう記述するのが効率良いでしょうか。

例えば、よくサンプルで見る、TListのItemにレコード型のポインタを使ってデータを入れる場合。
type
// レコード型A
PTRecA = ^TRecA;
TRecA = record
// 略
end;
// レコード型B
PTRecB = ^TRecB;
TRecB = record
// 略
end;

// クラスA・・・レコード型Aを利用
TClassA = class(TList)
 procedure SetItem(Rec: TRecA);
 function GetItems(Index: Integer): TRecA;
end;
// クラスB・・・レコード型Bを利用
TClassB = class(TList)
 procedure SetItem(Rec: TRecB);
 function GetItems(Index: Integer): TRecB;
end;

上記の様に、クラスAとクラスBで似た様なコードの重複が多い場合、
クラスの定義をもっと効率良く記述できる方法があれば教えていただきたいです。
179デフォルトの名無しさん
垢版 |
2016/12/22(木) 20:58:35.19ID:T2mCxqBZ
delphi ジェネリックスでググる
2016/12/24(土) 05:08:06.07ID:dJj6Jdn2
クラスの継承を使えないか?
レコードのほうに「違い」を押し込んでクラスにして継承して、クラスは共用とできないか?
そもそもクラスとレコードに分ける必要があるのか?
などなど
2016/12/24(土) 16:48:03.74ID:NvTs06qg
レコード型をクラスのメンバとしてポインタで管理して
そのポインタの実体を操作する仮想メソッドなどを作る。
182デフォルトの名無しさん
垢版 |
2016/12/24(土) 23:24:23.58ID:SRluPO+r
firemonkeyを使ってandroid向けのゲームを作り始めましたが
いきなり躓いて困ってます。

ゲームループのスレッドを作って描画を行っていますが
TBitmapがスレッドセーフでないため描画処理が正常に行えません。

firemonkeyでゲームを作る場合はメインスレッドのみで作るのでしょうか。
2016/12/25(日) 02:11:22.91ID:dFY2jBPw
lockしてもダメ?
2016/12/25(日) 09:12:26.41ID:LRNNB7e/
DrawGridのセルの色を取得する方法を教えて下さい。
どのセルに何色を塗ったか記憶しているのですか、
もっと簡単に知る方法があると思い質問させてもらいました。
宜しくお願いします。
2016/12/25(日) 09:56:13.82ID:HB1HITh4
>>182
スレッド側でBitmap描画してからSynchronize使ってメインスレッドのBitmapに転送すれ
2016/12/25(日) 09:59:02.44ID:BtIm+2Ns
>>183
Delphi6の時はCanvas.Lockがあったと思いますが
今使ってるDelphi10.1ではLockが見つからなくて・・・
2016/12/25(日) 10:11:02.14ID:BtIm+2Ns
>>185
スレッド側で描画用のBitmapをCreateしてWidth、Heightを設定した段階で
EBitmapSizeTooBigの例外が発生してしまうため、そこまで辿り着けなくて困ってます。
2016/12/25(日) 10:30:12.14ID:rexwkbDx
例外の種類見る限り、スレッドと関係なさそうに見えるが。
ビットマップが大きすぎるってWidthとHeightをいくつに設定しようとしたの?
2016/12/25(日) 10:36:40.00ID:BtIm+2Ns
>>188
サイズは350x450なのでたぶん大きすぎることはないと思います。
メインスレッドで動作させた場合は、例外が発生することなく動作するので
メインスレッド以外ではTBitmapは使えないのかと・・・

また、Windowsでは正常に動作してAndroidで動作させると例外が発生するため
Android固有の問題なのかなと思いまして
2016/12/25(日) 12:33:01.08ID:dFY2jBPw
>>186
map/unmap
2016/12/25(日) 17:27:44.55ID:HB1HITh4
>>189
AndroidのThreadで発生するってQPに上がってるからVOTEしとけばそのうち治るんじゃないかな
そのうち。
2016/12/25(日) 17:59:22.97ID:YEQFz9Pa
Delのバグかよ
2016/12/25(日) 18:04:15.67ID:BtIm+2Ns
>>190
教えていただいたものを使って処理を行ってみましたがダメでした。


>>191
期待しないで待つことにします。


別スレッドでの処理を諦めてとりあえずメインスレッドで全て行うようにします。
相談に乗っていただいた方々ありがとうございました!
2016/12/28(水) 09:28:27.13ID:aele3sW5
Delphi 10.1 BerlinのStarterでチュートリアルをやってます。
http://docwiki.embarcadero.com/RADStudio/Berlin/ja/ユーザー アクションに対する応答をコード エディタでコーディングする(IDE チュートリアル)
このページの中ほどまで進んだら
[dcc32 エラー] TextEditorUnit.pas(94): E2003 未定義の識別子 : 'TDialogServiceSync'
というエラーが表示されてしまいます。
どうしたら修正できるのでしょうか?
2017/01/01(日) 00:51:30.42ID:u9hnImCi
>>194
ここで引っかかってるのかな?
UserResponse := TDialogServiceSync.MessageDialog(
'File already exists. Do you want to overwrite?',
TMsgDlgType.mtInformation, mbYesNo, TMsgDlgBtn.mbYes, 0);

TDialogServiceSync はFire Monkeyでしか使えないからvclプログラムではエラーになって当然かも。
チュートリアルのソースコードって色々バグってるからなぁ…
とりあえず

UserResponse := MessageDlg(
'File already exists. Do you want to overwrite?',
TMsgDlgType.mtInformation, [mbYes, mbNo], 0);

と書き換えたらエラー出なくなると思う。
2017/01/02(月) 05:54:12.25ID:IPXAtosy
クラスファンクションなのかそれは?
197194
垢版 |
2017/01/02(月) 12:22:05.25ID:THkmnZCs
>>195
ありがとうございました。早速試してみましたが、
[dcc32 エラー] TextEditorUnit.pas(99): E2003 未定義の識別子 : 'mbYes'
[dcc32 エラー] TextEditorUnit.pas(99): E2250 指定された引数で呼び出すことのできるオーバーロード関数 'MessageDlg' が定義されていません
[dcc32 警告] TextEditorUnit.pas(99): W1000 シンボル 'MessageDlg' を使用することは推奨されていません : 'Use FMX.DialogService methods'
とエラーが出てコンパイルが通りませんでした。

FireMonkeyはデフォルトで使えるのかと思ってました。いろいろと無知すぎるので
もうちょっと分かりやすいところから勉強しなおしてみます。
2017/01/02(月) 20:49:19.17ID:7Rs/ksIu
>>197
その警告が出るって事はFire Monkeyの方なのか。
だったらそこは元の>>194の命令でいいはず。

usesの所に FMX.DialogService.Sync が記載されているか確認して
なければ追加。
2017/01/04(水) 22:56:01.95ID:SVZbRNc5
スレッドからサブフォームを表示する事は可能ですか?
他の機器から特定の信号が来たら、警告画面みたいなのを表示しようとして
スレッドで信号監視してフォーム表示のつもりがうまくいきません。
なのでメインフォームにタイマー置いてタイマーイベントで信号監視しています。
ヘルプを読むとスレッドからフォームはコントロール出来ないような事が書いてあったのですが、皆さんならどうしますか?
2017/01/04(水) 23:19:05.87ID:07zJ2hFc
表示するだけなんでしょ?

自分だったらpostmessage
2017/01/04(水) 23:55:57.26ID:07zJ2hFc
ごめん

post-/sendmessageにはwm_closeみたいな表示するメッセージはなかった

独自のメッセージを定義して受け取った側でshowするか
showwindow(async)を使うかだね
2017/01/05(木) 00:45:48.42ID:sWl9IbhJ
>>199
TThread.Synchronizeで、メインスレッドに切り替えてから、引数で渡されたコールバックメソッド(手続き)でサブフォームを表示させるとか
203194
垢版 |
2017/01/05(木) 06:34:16.06ID:KgVZC7r0
>>198
エラーが消えて無事に動きました。
ありがとうございます。

こういうのはIDEが教えてくれるのかと思って
いましたが、有料版だとそういう機能は
あるんでしょうかねー
2017/01/05(木) 07:19:36.75ID:DrifgVvY
>>203
関数や手続きが定義されていないってエラーが出たときはその関数などのヘルプを見て
そこに書いてあるユニット名が自分のプログラムのuses節に書かれているか調べるといいよ。
205199
垢版 |
2017/01/05(木) 09:38:01.68ID:u8XERnLo
>>200,202
ありがとうございます。
教えてもらった方法を調べながらやってみます。
2017/01/08(日) 16:20:11.76ID:lAdNqeO/
TShellCtrlコンポーネントって、デモに含まれるものなんだよね なんでVCLに含めなかった??
2017/01/09(月) 14:24:09.01ID:KdQvIKlc
>>199
Queue関数。
http://www.gesource.jp/weblog/?p=538
2017/01/10(火) 11:27:52.10ID:D5z5IiVv
マルチスレッドが終了したかどうか確認するのに、フラグで確認してるんだけど、
なんかもっとスマートな方法ってありませんか?
ググったらWaitForが出て来たのですが、hoge.WaitForとしてもハンドルエラーとか出て使えませんでした。
宜しくお願いします。
2017/01/10(火) 12:33:32.63ID:8tL5nmKS
何があなたのスマートの基準なのか?
フラグは別に悪くないと思うけど。
2017/01/10(火) 17:34:35.55ID:cSdSlPHe
freeが一番確実じゃない?
2017/01/10(火) 17:41:03.73ID:9hDOaePS
>>208
hogeってTThread?
そんだったらTThread.FreeOnTerminateをTrueにしてるから、
スレッドが終了してFreeされてるから、ハンドルエラーと出てくるんだろう。
FreeOnTerminiateをFalseにすればOK(そのかわりTThreadの破棄は自分でやる必要がある)。
2017/01/10(火) 18:11:59.83ID:uT10hEea
終了したか確認するのにWaitForしたら確認じゃなく待機しちゃってダメじゃないのかと思うけど。
FreeOnTerminiate:=true;で OnTerminateイベントでフラグ立てるので良くないかい?
あとはメインフォームに終了通知としてメッセージ送るとか。
Win32API使うのOKなら FreeOnTerminiate:=false; にして
スレッドハンドルに対して WaitForSingleObject (タイムアウトは0に設定)使い
WAIT_OBJECT_0が返るかWAIT_TIMEOUTが返るか確認する。
もしくはGetExitCodeThread関数を使うとかかな。
2017/01/10(火) 18:56:40.06ID:XaHxjxQc
そういやスレッドの終わり方の議論が2、3年前にあったな
2017/01/10(火) 19:15:27.36ID:9hDOaePS
FreeOnTerminateが使えない?とかいう議論じゃなかったっけw
2017/01/10(火) 21:06:50.37ID:8tL5nmKS
FreeOnTerminiate:=true;で OnTerminateイベントでフラグ立てる

に賛成。簡単確実。
2017/01/11(水) 07:54:30.57ID:7+b9GoiT
>>215
そのフラグの排他制御は簡単じゃないよ
2017/01/11(水) 08:27:35.32ID:7+b9GoiT
ああOnTerminate 内はメインスレッドか。
なら簡単だわ。メンゴ。
昔はOnTerminateイベント無かった希ガス
218208
垢版 |
2017/01/11(水) 08:51:02.04ID:jn+AzvnI
おはようございます。
皆さん、ありがとうございます。
フラグがやはり良さげなんですね。

もう1つ教えて下さい。
スレッドの中で
try
stringlist:=TStringList.Create;
while not Terminete do
begin
何かの処理
end;
finally
stringlist.free;
End;
とした時に、TermineteをTrueにして終了するとfinallyの処理をしてくれません。
異常終了した時はfinallyの処理をしてくれます。
stringlistの解放はOnTermineteでするのが普通なのでしょうか?
2017/01/11(水) 12:16:51.30ID:CK/PUOqI
>>218
構文が変だよ

tryが抜けてる
2017/01/11(水) 14:34:41.49ID:Rshx8mvt
>>219
tryはあるが?
2017/01/11(水) 14:43:08.49ID:mOqhfYH5
>とした時に、TermineteをTrueにして終了するとfinallyの処理をしてくれません。
んなわけない。ちゃんとfinallyの処理するはずだからもっとしっかり確認しよう。

>フラグがやはり良さげなんですね。
もうちょっと具体的にスレッド終わった後何したいのかとか書いてくれんと答えようがねぇ。
2017/01/11(水) 17:34:02.96ID:y79IyYLw
>>220
ホントだtryはあった...でも
最近のdelphiは仕様が変わったのか...

念のため例外処理入れてみたら?

list=:tstringlist.create;
try try
while not terminated do begin ...end;
// ここで正常処理終了のフラグをセット
except....end;
finally list.free; end;
2017/01/11(水) 18:26:26.78ID:tCuecbSb
>>218
>TermineteをTrueにして終了するとfinallyの処理をしてくれません。
どうやって確認したの?
あとTThreadの派生クラスならTerminateはメソッドとTerminatedプロパティが使える。

>stringlistの解放はOnTermineteでするのが普通なのでしょうか?
そんなことはない。
224デフォルトの名無しさん
垢版 |
2017/01/11(水) 18:29:24.22ID:+wq8yOB3
昔昔、QuadrupleDを使ってやってたサウンドの再生を最新のDelphiでやりたいんですが、使えるライブラリを探してます。

・複数のwaveファイルをマルチチャネルで読み込んでそれぞれ別個に再生したい
・チャネル単位でループ再生、ピッチ変更、音量変更がしたい

あるかな…(´・ω・`)
2017/01/11(水) 21:03:36.27ID:go3Ym2g4
ブレーク入れてね
ステップで見るときブレーク入れないと
見かけ飛ばすから
2017/01/12(木) 06:31:56.17ID:a5xM53E0
フラグの排他制御は簡単だと思うが。
boolean変数一個なら読み書きは1命令で、割り込まれることはないだろうし
書く前に消されちゃうようなコードを書かなければいいだけ。
2017/01/12(木) 07:43:07.08ID:pteiZ85t
>>226
きちんとした知識がある人にとっては簡単だよね
2017/01/13(金) 08:37:54.09ID:ZuNdbFdt
フラグをグローバルやメインフォームなどに
持たせるのはなんか古臭いという気持ちはある
2017/01/14(土) 13:08:24.40ID:gjFRSJdj
元号変わったらどうすっかな
D7だと対応できんだろ
2017/01/14(土) 13:25:01.19ID:h3eR+GmF
>>229
元号とか使わないか
自力で変換

OSの機能を使ってるんだったら大丈夫か
ただvistaも今春でサポート終了するけど
2017/01/17(火) 17:31:21.77ID:O6RaaTFv
Berlin試したみたけど以前ここで言った
gifアニメのバグが解消されてないな
2017/01/18(水) 13:40:10.70ID:YhLwefSp
string、ansichar、pansicharの型キャストってどうやるの?
暗黙の型キャストの警告を消したいんだけど、ググってstrpcopyとかのサンプルを実行しても消えない。
2017/01/19(木) 15:50:04.40ID:5UKguDxp
>>232
string(ansistring変数)とかで消えない?
2017/01/20(金) 09:53:10.19ID:1eiriAuJ
具体的なコードを挙げてみては?
2017/01/27(金) 12:59:02.17ID:/S2JEwyl
Konopkaコンポーネントのアンインストール方法を教えて下さい。
インストール中に異常終了したのでアンインストールしたいのですが、
アンインストールも途中終了してしまって、行き詰ってしまいました。
よろしくお願いします。
2017/01/27(金) 14:49:41.44ID:5OkJm/3R
>>235
マイドキュメント\Embarcadero\Studio\18.0\CatalogRepositoryにあるKonopkaのフォルダと
パブリックのドキュメント\Embarcadero\Studio\18.0\CatalogRepositoryにあるKonopkaの
リポジトリデータを削除すればよかったと思う。(心配ならバックアップとっといてね)

konopka、インストール失敗するとアンインストールもできなくなるんだよね。
237235
垢版 |
2017/01/27(金) 22:35:47.30ID:/S2JEwyl
>>236
ありがとうございます。
助かりました。
2017/02/01(水) 09:20:48.68ID:5qzbuLNZ
入力の支援機能で出て来た候補にカーソルを合わせて、
ピリオド打ったら選んだ候補が入力される設定ってどこにありますか?
ベルリンのup2を入れたのですが、最初は良かったのにいつの間にかピリオドで選択されなくなってしまいました。
2017/02/06(月) 19:05:34.17ID:xOrt0AYX
StringGridのセルをデータの合わせて塗りつぶすことをしています。
タイマーイベントで0.2秒毎にデータに変化がなくても一旦デフォルト色にしてから他の色を塗っています。
そのせいだと思うのですがセルの選択ができません。
セルをランダムに色を塗りつつ、セルの選択もできるようにするにはどうしたらいいでしょうか?
2017/02/06(月) 20:35:02.64ID:iNTq03fP
おんどろーせる
2017/02/06(月) 20:38:57.75ID:U9v8FdBr
TSringGridのOnDrawCellイベントの引数で渡されるTGridDrawStateで、選択されたかどうか判断できる。
選択されてないときだけ、色を変更するよろし。
242239
垢版 |
2017/02/06(月) 22:36:47.54ID:xOrt0AYX
>>240.241
ありがとうございます。
まだ、試してませんがどういうコードを書けば良いか案が浮かびました。
2017/02/07(火) 04:11:46.40ID:odr3U2KT
タイマーで200ミリ秒ずつやってるところが壮絶にまぬけっぽい 小学生以下の知能
2017/02/07(火) 07:48:29.48ID:uL0lBsbg
Delphi(デルファイ)について、他のスレッドでは書き込めない超低レベル、もしくは
質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。

Delphi使いが優しくコメントを返しますが、
お礼はDelphiの布教と初心者の救済をお願いします。
245239
垢版 |
2017/02/07(火) 14:14:09.54ID:vf4YiH1/
昨日はありがとうございました。
TSringGridの特定のセルに数値を書き込むのにDrawTextを使って右寄せで書き込んでいます。
この書き込んだ数値を後から取得することってできますか?
セルにHintみたいに埋め込めたら簡単なんですけどググっても分かりませんでした。

>>243
シーケンサーの信号状態を監視するんで手っ取り早くタイマー使ってます。
2017/02/07(火) 21:01:48.32ID:qgMFF5pP
その「数値」はどこにしまってあるの? それは自分で世話するしかない。
DrawTextは文字列を描画するだけで、何書いたかなんてどこにも覚えていないよ。
2017/02/07(火) 22:53:48.58ID:GEF3mu7C
StringGridなんだから、Cellsプロパティを通して、文字列として各セルにでも入れときゃいいんでね?(ハナホジ
2017/02/08(水) 07:16:05.46ID:3kd0dWw+
>>245
格納するオブジェクトも実装したらいいんじゃ
2017/02/12(日) 16:38:05.20ID:iYdKWxWq
整数ならcellのobjects(だったっけかな)に入れときゃ良いじゃん
2017/02/26(日) 22:21:06.30ID:S5w82ICF
vs2015アンインスコしたらDel10.1でコンパイルできなくなった。
Del再インスコするしかない?
2017/02/26(日) 22:23:37.25ID:8hwVjJWR
環境変数消されてるとか?
2017/02/26(日) 23:37:41.28ID:S5w82ICF
>>251
ありがとうございます。
調べてみます。
2017/03/14(火) 14:46:39.28ID:SzM2z6wx
スレッド1で変数aの値を読み書きしていてスレッド2では変数aを読み込みしかしない場合って干渉対策って必要?
2017/03/14(火) 15:58:50.80ID:vbV/Jpv3
うん
255253
垢版 |
2017/03/14(火) 22:26:02.83ID:M7D1b0oM
ありがとうございます。
干渉対策じゃなくて排他処理っていうんですね。
失礼しました。
各スレッドで共有する変数を集めたUnitに変数aを宣言して使っています。
この変数aを複数のスレッドからアクセスする場合、Synchronizeを使うのでしょうか?
SynchronizeはスレッドからVCLを描画する場合に使うと書いてあったので、フラグを立てるとかして
排他処理をするのでしょうか?
2017/03/14(火) 23:05:45.72ID:137tpMLx
クリティカルセクションでも使えばいい、どっかで
CS := TCricalSection.Create()で作っておいて、

同時にアクセスされたら困るところで
CS.Enter();
try
 共有リソースの変数Aにアクセスなど
finally
 CS.Leave();
end;
2017/03/14(火) 23:07:46.72ID:137tpMLx
まぁ、他にもSyncObjs.pasにTInterlockedとかあるけど、
そこは自分で頑張ってくれ
2017/03/15(水) 07:56:13.67ID:OMQXGO2Q
>>255
Synchronize内の処理はメインスレッドでの処理となるから
同時アクセスがありえなくなるということらしいよ
259253
垢版 |
2017/03/16(木) 09:51:28.35ID:IMOOaoXR
皆さん、ありがとうございます。
これから調べて確認しようと思うのですが、最後に1つ教えて下さい。
シンクロナイズを使い過ぎるとマルチスレッドの意味が無くなるとヘルプに書いてありました。
クリティカルセクション等は使い過ぎてもメインフォームの反応が悪くなるとかそういう事が無くなる、若しくは低減されるとかあるのでしょうか?
もし、それならクリティカルセクション等を推奨すると思うので使い過ぎはやはりダメとは思いますがどうなんでそょう?
260デフォルトの名無しさん
垢版 |
2017/03/16(木) 17:53:22.67ID:Xe646fvV
どこからが使いすぎだと思う?
2017/03/16(木) 18:29:10.53ID:vq3uRAd1
>>259
ウインドウ描画などしているスレッドが「メインVCLスレッド」。
要するにメッセージループが動作しているスレッド。
Synchronizeはこのメッセージループに「渡したプロシージャの処理を任せる」ため
Synchronizeを多用すると「メインフォームの反応が悪くなる」という状況を生む。
Synchronizeはあくまで変数のアクセスと言った軽い処理に限定すればいい。
この場合、メッセージループがウィンドウメッセージを処理する合間に変数へのアクセスを処理する程度なので
その程度で「メインフォームの反応が悪くなる」ということはないだろう。
ただ、もし重たい処理を任せてしまうと、フォームのイベントで処理するのと同じになってしまう。
(フォームなどコンポーネントのイベントはメインVCLスレッドで動作している)
この場合メインフォームの反応が悪くなる。

クリティカルセクションはメッセージループとか関係ないので、それによってメインフォームの反応が悪くなるということはない。
ただ例外として、メインVCLスレッドでクリティカルセクションを使うと、
他のスレッドが使用中はメインVCLスレッドは待機してしまうのでメインフォームの反応が悪くなることはある。
2017/03/17(金) 07:45:46.44ID:88SBOT8h
>>259
問題は「使い過ぎ」の定義だと思うけど
僕は1つ1つの処理の長さが長くなってしまった場合をいってるのではないかと思う。
同時処理といっても現実は短い処理が交互に行われるのをスレッドと称しているだけであって
それを否定するようなプログラミングはもはやスレッドではないということではないかと。
2017/03/17(金) 09:01:04.72ID:88SBOT8h
あ、もしかしたら質問に答えてなかったかな?
つまりsyncronizeだろうがcsだろうが
占有状態が長くなるようなロジックになるなら同じことだ
2017/03/17(金) 17:25:37.85ID:c2lVMe4f
>>262
今のcpuは普通にマルチコア、マルチスレッドじゃない?
同時に動いてんじゃない?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況